最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文詳解Go的面向?qū)ο缶幊?/h1>
 更新時(shí)間:2023年04月27日 09:29:56   作者:Pokeya  
本文主要圍繞 Golang 的 Object-oriented 所展開,介紹了其基本的面向?qū)ο蟮幕靖拍罴按a實(shí)戰(zhàn),有需要的小伙伴跟著小編一起來學(xué)習(xí)吧

概述

  • Go 語言的面向?qū)ο缶幊逃腥齻€(gè)重要的思想:封裝、繼承和多態(tài)。
  • 封裝

Go 語言通過 struct 結(jié)構(gòu)體的方式來實(shí)現(xiàn)封裝,結(jié)構(gòu)體可以包含各種類型的變量和方法,可以將一組相關(guān)的變量和方法封裝在一起。使用首字母大小寫控制變量和方法的訪問權(quán)限,實(shí)現(xiàn)了信息隱藏和訪問控制。

  • 繼承

Go 語言中沒有傳統(tǒng)的繼承機(jī)制,但是可以使用嵌入式類型來實(shí)現(xiàn)類似繼承的效果,將一個(gè)類型嵌入到另一個(gè)類型中,從而繼承嵌入類型的方法和屬性。嵌入式類型的特點(diǎn)是可以直接訪問嵌入類型的屬性和方法,不需要通過接口或者其他方式進(jìn)行轉(zhuǎn)換。在 Go 語言中,可以通過 struct 嵌套和 interface 嵌套來實(shí)現(xiàn)繼承的效果。

  • 多態(tài)

Go 語言通過接口來實(shí)現(xiàn)多態(tài),一個(gè)類型只需要實(shí)現(xiàn)了接口的所有方法,就可以被賦值給該接口類型的變量。這樣可以實(shí)現(xiàn)類似于面向?qū)ο笳Z言中的多態(tài)性。多態(tài)性使得程序可以根據(jù)上下文環(huán)境自動(dòng)選擇合適的方法實(shí)現(xiàn),提高了代碼的靈活性和可復(fù)用性。

實(shí)戰(zhàn)

常規(guī)函數(shù)寫法

在這個(gè)示例中,函數(shù)和結(jié)構(gòu)體是分離的,函數(shù)接收結(jié)構(gòu)體指針類型作為參數(shù),需要手動(dòng)傳遞結(jié)構(gòu)體的指針。盡管這種方式有一定的缺陷,調(diào)用會(huì)比較麻煩,但它更加符合基于過程式編程思想的設(shè)計(jì)理念,即將一個(gè)大問題拆分成多個(gè)小問題,并通過函數(shù)解決這些小問題。適用于初學(xué)者對(duì)于代碼的簡(jiǎn)單操作。優(yōu)點(diǎn)就只有易于理解。

package test

import (
    "fmt"
    "testing"
)

type Mobile struct {
    User  string  `json:"user"`
    Brand string  `json:"brand"`
    Prise float64 `json:"prise"`
}

func CallUp(m *Mobile) {
    fmt.Printf("%s is using ??%.2f mobile phone to make a call.\n", m.User, m.Prise)
}

func Storage(m *Mobile) {
    fmt.Printf("%s is using a %s mobile phone to transfer data.\n", m.User, m.Brand)
}

func Charge(m *Mobile) string {
    return fmt.Sprintf("%s is charging a %s phone.\n", m.User, m.Brand)
}

func Game(m *Mobile, name string) {
    fmt.Printf("%s is playing the game of '%s'.\n", m.User, name)
}

func TestExample(t *testing.T) {
    iPhone := Mobile{
        User:  "Tom",
        Brand: "iPhone 15 Pro MAX",
        Prise: 12688.00,
    }
    CallUp(&iPhone)
    Game(&iPhone, "Card")
    Storage(&iPhone)
    fmt.Printf(Charge(&iPhone))
}

調(diào)用結(jié)構(gòu)體類型上的方法

調(diào)用結(jié)構(gòu)體類型上的方法體現(xiàn)了面向?qū)ο缶幊痰姆庋b思想。封裝的核心是將數(shù)據(jù)和行為打包在一起,通過公開和私有的方式來隱藏實(shí)現(xiàn)細(xì)節(jié)。這樣可以使得代碼更加模塊化、安全、易于維護(hù),并且更加符合現(xiàn)實(shí)世界中的抽象模型。

相比于上面的函數(shù)調(diào)用,調(diào)用結(jié)構(gòu)體類型上的方法可以使調(diào)用方法時(shí)不必手動(dòng)傳遞結(jié)構(gòu)體實(shí)例對(duì)象,只需聚焦于方法參數(shù)本身,提高了代碼的可讀性和易用性。這也符合面向?qū)ο缶幊痰暮?jiǎn)潔性和代碼重用性的思想。

?? 提示:在代碼注釋中類比了 Python 中類的寫法。

package test

import (
    "fmt"
    "testing"
)

// class Mobile(object)
type Mobile struct {
    User  string  `json:"user"`
    Brand string  `json:"brand"`
    Prise float64 `json:"prise"`
}

// def __init__(user, brand, prise)
func NewMobile(user string, brand string, prise float64) *Mobile {
    return &Mobile{User: user, Brand: brand, Prise: prise}
}

// def call_up(self)
func (m *Mobile) CallUp() {
    fmt.Printf("%s is using ??%.2f mobile phone to make a call.\n", m.User, m.Prise)
}

// def storage(self)
func (m *Mobile) Storage() {
    fmt.Printf("%s is using a %s mobile phone to transfer data.\n", m.User, m.Brand)
}

// def charge(self)
func (m *Mobile) Charge() string {
    return fmt.Sprintf("%s is charging a %s phone.\n", m.User, m.Brand)
}

// def game(self, name)
func (m *Mobile) Game(name string) {
    fmt.Printf("%s is playing the game of '%s'.\n", m.User, name)
}

func TestExample(t *testing.T) {
    applePhone := NewMobile("Tom", "iPhone 15 Pro MAX", 12688.00)
    applePhone.CallUp()
    applePhone.Game("Card")
    applePhone.Storage()
    fmt.Printf(applePhone.Charge())
}

調(diào)用接口類型上的方法

接口實(shí)例: 是指定義一個(gè)接口類型,并將具體的結(jié)構(gòu)體類型的實(shí)例傳遞給它。

調(diào)用接口類型上的方法,將接口與結(jié)構(gòu)體類型分開,使接口具有更廣泛的適用性。使用 “接口實(shí)例” 可以實(shí)現(xiàn)更靈活的代碼設(shè)計(jì),因?yàn)榭梢栽谶\(yùn)行時(shí)動(dòng)態(tài)地選擇要使用的實(shí)現(xiàn)類型。

同時(shí),由于接口只關(guān)心方法的簽名,而不關(guān)心具體實(shí)現(xiàn)方式,因此可以將不同的結(jié)構(gòu)體類型傳遞給同一個(gè)接口,從而實(shí)現(xiàn)面向?qū)ο笏枷氲亩鄳B(tài)性。

在這個(gè)示例中,定義了一個(gè) USB 接口和 PlayBoy 接口,它們都包含各自的方法。在測(cè)試函數(shù)中調(diào)用這兩個(gè)接口的方法時(shí)需要分別調(diào)用。這兩個(gè)接口之間沒有直接的聯(lián)系或關(guān)聯(lián),它們是相互獨(dú)立的。如果你想將這兩個(gè)接口組合在一起,可以使用 “嵌入式接口”。

package test

import (
    "fmt"
    "testing"
)

var (
    applePhone, huaweiPhone *Mobile
)

func init() {
    applePhone = NewMobile("Tom", "iPhone 15 Pro MAX", 12688.00)
    huaweiPhone = NewMobile("John", "Huawei Meta 40 Pro", 8888.00)
}

type USB interface {
    Storage()
    Charge() string
}

type PlayBoy interface {
    Game(name string)
}

type Mobile struct {
    User  string  `json:"user"`
    Brand string  `json:"brand"`
    Prise float64 `json:"prise"`
}

func NewMobile(user string, brand string, prise float64) *Mobile {
    return &Mobile{User: user, Brand: brand, Prise: prise}
}

func (m *Mobile) CallUp() {
    fmt.Printf("%s is using ??%.2f mobile phone to make a call.\n", m.User, m.Prise)
}

func (m *Mobile) Storage() {
    fmt.Printf("%s is using a %s mobile phone to transfer data.\n", m.User, m.Brand)
}

func (m *Mobile) Charge() string {
    return fmt.Sprintf("%s is charging a %s phone.\n", m.User, m.Brand)
}

func (m *Mobile) Game(name string) {
    fmt.Printf("%s is playing the game of '%s'.\n", m.User, name)
}

func TestExample(t *testing.T) {
    USB.Storage(applePhone)
    fmt.Printf(USB.Charge(huaweiPhone))
    PlayBoy.Game(huaweiPhone, "LOL")
}

嵌入式接口

嵌入式接口: 是一種將一個(gè)接口嵌入到另一個(gè)接口中的技術(shù),嵌入的接口中的所有方法都會(huì)被繼承到當(dāng)前接口中。通過接口的嵌套,可以將多個(gè)接口組合成一個(gè)更大的接口,從而使代碼更加簡(jiǎn)潔、靈活。這也體現(xiàn)了面向?qū)ο缶幊讨械睦^承特性。

在這個(gè)示例中,定義了一個(gè) IPhone 接口,它嵌入了 USB 接口和 PlayBoy 接口,以及 CallUp() 方法。 從而可以使用這三個(gè)接口中的所有方法。通過這種方式,我們可以將不同的接口組合成一個(gè)更大的接口,以便更方便地使用這些方法。在測(cè)試函數(shù)中,我們創(chuàng)建了一個(gè) Mobile 類型的實(shí)例,并將其轉(zhuǎn)換為 IPhone 類型的接口實(shí)例 p,然后可以使用 p 調(diào)用 Mobile 結(jié)構(gòu)體中實(shí)現(xiàn)的 CallUp()Game()、Storage()Charge() 方法。

package test

import (
    "fmt"
    "testing"
)

type IPhone interface {
    USB
    PlayBoy
    CallUp()
}

type USB interface {
    Storage()
    Charge() string
}

type PlayBoy interface {
    Game(name string)
}

type Mobile struct {
    User  string  `json:"user"`
    Brand string  `json:"brand"`
    Prise float64 `json:"prise"`
}

func (m *Mobile) CallUp() {
    fmt.Printf("%s is using ??%.2f mobile phone to make a call.\n", m.User, m.Prise)
}

func (m *Mobile) Storage() {
    fmt.Printf("%s is using a %s mobile phone to transfer data.\n", m.User, m.Brand)
}

func (m *Mobile) Charge() string {
    return fmt.Sprintf("%s is charging a %s phone.\n", m.User, m.Brand)
}

func (m *Mobile) Game(name string) {
    fmt.Printf("%s is playing the game of '%s'.\n", m.User, name)
}

func TestExample(t *testing.T) {
    newMobile := &Mobile{User: "John", Brand: "Huawei Meta 40 Pro", Prise: 8888.00}
    var p IPhone = newMobile
    p.CallUp()
    p.Game("Card")
    p.Storage()
    fmt.Printf(p.Charge())
}

到此這篇關(guān)于一文詳解Go的面向?qū)ο缶幊痰奈恼戮徒榻B到這了,更多相關(guān)Go面向?qū)ο髢?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用go module導(dǎo)入本地包的方法教程詳解

    使用go module導(dǎo)入本地包的方法教程詳解

    go module 將是Go語言默認(rèn)的依賴管理工具。到今天 Go1.14 版本推出之后 Go modules 功能已經(jīng)被正式推薦在生產(chǎn)環(huán)境下使用了。本文重點(diǎn)給大家介紹如何使用 go module 導(dǎo)入本地包,感興趣的朋友一起看看吧
    2020-03-03
  • Golang的命名規(guī)范及最佳實(shí)踐(推薦!)

    Golang的命名規(guī)范及最佳實(shí)踐(推薦!)

    這篇文章主要給大家介紹了關(guān)于Golang的命名規(guī)范及最佳實(shí)踐的相關(guān)資料,命名規(guī)則涉及變量、常量、全局函數(shù)、結(jié)構(gòu)、接口、方法等的命名,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • 詳解golang中模板的常用語法

    詳解golang中模板的常用語法

    這篇文章主要介紹了golang模板中的常用語法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • 10個(gè)可以優(yōu)化代碼的Go語言技巧分享

    10個(gè)可以優(yōu)化代碼的Go語言技巧分享

    這篇文章主要為大家詳細(xì)介紹了10個(gè)可以優(yōu)化代碼的Go語言技巧,從而讓我們的代碼更加優(yōu)雅,文中的示例代碼講解詳細(xì),需要的小伙伴可以參考下
    2024-01-01
  • 一文帶你了解GO語言中方法的應(yīng)用

    一文帶你了解GO語言中方法的應(yīng)用

    GO?語言中的方法實(shí)際上和函數(shù)是類似的,只不過在函數(shù)的基礎(chǔ)上多了一個(gè)參數(shù),這篇文章主要為大家介紹一下GO語言中方法的應(yīng)用,需要的可以參考下
    2023-09-09
  • go語言for循環(huán)中嵌套defer的執(zhí)行順序

    go語言for循環(huán)中嵌套defer的執(zhí)行順序

    在Go語言中,defer語句用于延遲函數(shù)調(diào)用的執(zhí)行,本文主要介紹了go語言for循環(huán)中嵌套defer的執(zhí)行順序,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-03-03
  • 淺析Go語言中Channel的各種用法

    淺析Go語言中Channel的各種用法

    這篇文章主要帶大家一起來學(xué)習(xí)一下Go語言中的if語句,也就是大家口中的判斷語句。文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語言有一定幫助,需要的可以參考一下
    2022-11-11
  • 部署Go語言項(xiàng)目的 N 種方法(小結(jié))

    部署Go語言項(xiàng)目的 N 種方法(小結(jié))

    這篇文章主要介紹了部署Go語言項(xiàng)目的 N 種方法(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Go?iota關(guān)鍵字與枚舉類型實(shí)現(xiàn)原理

    Go?iota關(guān)鍵字與枚舉類型實(shí)現(xiàn)原理

    這篇文章主要介紹了Go?iota關(guān)鍵字與枚舉類型實(shí)現(xiàn)原理,iota是go語言的常量計(jì)數(shù)器,只能在常量的表達(dá)式中使用,更多相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-07-07
  • golang?gorm錯(cuò)誤處理事務(wù)以及日志用法示例

    golang?gorm錯(cuò)誤處理事務(wù)以及日志用法示例

    這篇文章主要為大家介紹了golang?gorm錯(cuò)誤處理事務(wù)以及日志用法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04

最新評(píng)論

耿马| 鸡西市| 荣昌县| 无锡市| 武乡县| 敖汉旗| 赞皇县| 区。| 孝义市| 镇雄县| 沧州市| 秦安县| 琼海市| 奉化市| 中西区| 长垣县| 基隆市| 石城县| 海淀区| 聂荣县| 五指山市| 泉州市| 西乡县| 宜昌市| 聂荣县| 彭水| 宁陵县| 晋宁县| 临泉县| 神木县| 和静县| 岳普湖县| 开封县| 来宾市| 那坡县| 民勤县| 南涧| 开原市| 浮山县| 甘南县| 淮阳县|