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

golang 接口嵌套實現(xiàn)復(fù)用的操作

 更新時間:2021年04月29日 10:32:17   作者:學(xué)_徒  
這篇文章主要介紹了golang 接口嵌套實現(xiàn)復(fù)用的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

大家還是直接看代碼吧~

package main
import (
    "fmt"
)
func main() {
    start(NewB(C{}))
    start(NewB(D{}))
}
type A interface {
    what()
}
type B struct {
    A
}
type C struct {
}
func (b C) what() {
    fmt.Println("this is type C")
}
type D struct {
}
func (b D) what() {
    fmt.Println("this is type D")
}
func start(b B) {
    b.what()
}
func NewB(a A) B {
    return B{a}
}

補充:【玩轉(zhuǎn)Golang】通過組合嵌入實現(xiàn)代碼復(fù)用

應(yīng)用開發(fā)中的一個常見情景,為了避免簡單重復(fù),需要在基類中實現(xiàn)共用代碼,著同樣有助于后期維護。

如果在以往的支持類繼承的語言中,比如c++,Java,c#等,這很簡單!可是go不支持繼承,只能mixin嵌入

且看下面的代碼:

type ManKind interface{
    Say(s string);   
    GetMouth()string
}
type Man struct{
   
}
func NewMan() ManKind{
    return &Man{};
}
func (this *Man)GetMouth()string{
    return "M0"
}
func (this *Man) Say(s string){
    fmt.Printf("\n Speak with mouth[%s] : \"%s\"",this.GetMouth(),s);
}
type StrongMan struct{
    Man
}
func NewStrongMan()ManKind{
    return &StrongMan{}
}
func (this*StrongMan)GetMouth()string{
    return "M1"
}
func main(){    
    NewMan().Say("good luck!")
    NewStrongMan().Say("good luck!")
}

如果支持繼承,很明顯應(yīng)該輸出

Speak with mouth[M0] : "good luck!"

Speak with mouth[M1] : "good luck!"

但是在golang中只能輸出:

Speak with mouth[M0] : "good luck!"

Speak with mouth[M0] : "good luck!"

StrongMan中調(diào)用Say(),此時可以將指針傳遞到內(nèi)嵌類,只是簡單的指向了Man的方法,在ManKind中調(diào)用GetMouth就是ManKind自己的GetMouth,和StrongMan沒有關(guān)系。

當(dāng)然,我們可以在StrongMan中覆蓋Say方法

func (this *StrongMan)Say(s string){
    fmt.Printf("\n Speak with mouth[%s] : \"%s\"",this.GetMouth(),s);
}

此時,當(dāng)然可以正確輸出,因為本來調(diào)用的就都是StrongMan自己的方法了,這又和我們的初衷相違背了。那么這種情況怎么實現(xiàn)呢?我的方法是,讓Man再臟一點兒,把需要的東西傳遞給組合進(jìn)來的類。

給Man增加一個屬性mouth,增加一個SetMouth方法,修改一下GetMouth方法,StrongMan的GetMouth方法刪除掉,再修改一下NewStrongMan方法

最后的代碼如下:

package main
import(
    "fmt"
)
type ManKind interface{
    Say(s string);    
    SetMouth(m string)
    GetMouth()string
}
type Man struct{
    ManKind    
    mouth string
}
func NewMan() ManKind{
    return &Man{mouth:"M0"};
}
func (this *Man)GetMouth()string{
    return this.mouth;
}
func (this *Man)SetMouth(s string){
    this.mouth=s;
}
func (this *Man) Say(s string){
    fmt.Printf("\n Speak with mouth[%s] : \"%s\"",this.GetMouth(),s);
}
type StrongMan struct{
    Man
}
func NewStrongMan()ManKind{
    sm := &StrongMan{}
  sm.SetMouth("M1");
  return sm;
}
    
func main(){    
    NewMan().Say("good luck!")
    &NewStrongMan().Say("good luck!")
}

當(dāng)然,如果你不愿意用Get、Set方法,也可以直接輸出Man的Mouth屬性。

我總結(jié)的嵌入式編程要點:

1,被嵌入的類的方法,只能訪問他自己的字段,包裝類即時聲明了同名字段也沒用。

2,包裝類可以覆蓋嵌入類的方法,但是嵌入類訪問不到,亦然訪問自己的方法。只能在包裝類中連同調(diào)用方法一同實現(xiàn)。

3,包裝類覆蓋嵌入類字段后,亦然可以通過嵌入類的類名訪問嵌入類的字段。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • Golang實現(xiàn)的聊天程序服務(wù)端和客戶端代碼分享

    Golang實現(xiàn)的聊天程序服務(wù)端和客戶端代碼分享

    這篇文章主要介紹了Golang實現(xiàn)的聊天程序服務(wù)端和客戶端代碼分享,本文先是講解了實現(xiàn)邏輯,然后給出了實現(xiàn)代碼,需要的朋友可以參考下
    2014-10-10
  • Go語言中嵌入式緩存庫的用法詳解

    Go語言中嵌入式緩存庫的用法詳解

    Go?語言中有一些非常高效的嵌入式緩存庫,groupcache?和?bigcache?是兩個非常流行且高性能的庫,本文將詳細(xì)介紹一下二者的用法,有需要的小伙伴可以參考下
    2025-01-01
  • Golang中常用的語法糖分享

    Golang中常用的語法糖分享

    語法糖,也稱糖語法,是由英國計算機科學(xué)家彼得·蘭丁提出的,用于表示編程語言中的某種類型的語法,這些語法不會影響功能,但使用起來卻很方便,本文就來看看Golang中常用的語法糖有哪些吧
    2023-05-05
  • 淺談Golang的new與make區(qū)別是什么

    淺談Golang的new與make區(qū)別是什么

    本文主要介紹了Golang的new與make區(qū)別是什么,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 使用Golang輕松實現(xiàn)JWT身份驗證的示例代碼

    使用Golang輕松實現(xiàn)JWT身份驗證的示例代碼

    JSON Web Tokens (JWT)是一種流行的安全方法,用于在兩個方之間表示聲明,本文主要為大家詳細(xì)介紹了實現(xiàn)Go應(yīng)用程序中的JWT身份驗證過程,需要的可以參考下
    2024-02-02
  • 一文搞懂Go語言標(biāo)準(zhǔn)庫strconv

    一文搞懂Go語言標(biāo)準(zhǔn)庫strconv

    strconv包實現(xiàn)了基本數(shù)據(jù)類型和其字符串表示的相互轉(zhuǎn)換,本文主要介紹Go語言標(biāo)準(zhǔn)庫strconv,想要學(xué)習(xí)strconv標(biāo)準(zhǔn)庫的可以了解一下
    2023-04-04
  • 執(zhí)行g(shù)o?vendor第三方包版本沖突問題解決

    執(zhí)行g(shù)o?vendor第三方包版本沖突問題解決

    這篇文章主要為大家介紹了執(zhí)行g(shù)o?vendor時,第三方包go版本沖突問題的解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Go語言實戰(zhàn)之實現(xiàn)一個簡單分布式系統(tǒng)

    Go語言實戰(zhàn)之實現(xiàn)一個簡單分布式系統(tǒng)

    如今很多云原生系統(tǒng)、分布式系統(tǒng),例如?Kubernetes,都是用?Go?語言寫的,這是因為?Go?語言天然支持異步編程。本篇文章將介紹如何用?Go?語言編寫一個簡單的分布式系統(tǒng),需要的小伙伴開業(yè)跟隨小編一起學(xué)習(xí)一下
    2022-10-10
  • Go利用GJSON組件解鎖JSON讀取新姿勢

    Go利用GJSON組件解鎖JSON讀取新姿勢

    Go 標(biāo)準(zhǔn)庫提供了 encoding/json 包用于處理 json 數(shù)據(jù),同時第三方庫 GJSON & SJSON 也在 json 處理方面表現(xiàn)出色,下面我們就來看看如何使用GJSON解鎖JSON讀取新方法吧
    2025-03-03
  • Go實現(xiàn)快速生成固定長度的隨機字符串

    Go實現(xiàn)快速生成固定長度的隨機字符串

    這篇文章主要為大家詳細(xì)介紹了怎樣在Go中簡單快速地生成固定長度的隨機字符串,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,需要的可以學(xué)習(xí)一下
    2022-10-10

最新評論

南澳县| 岳阳县| 延寿县| 隆德县| 淮阳县| 武陟县| 滕州市| 沁源县| 海原县| 清原| 泗洪县| 仁怀市| 古蔺县| 肇庆市| 洪湖市| 阿瓦提县| 沙洋县| 新闻| 广西| 遵化市| 静海县| 延长县| 合作市| 南澳县| 波密县| 扎鲁特旗| 津南区| 兴城市| 贺州市| 金乡县| 左云县| 阜宁县| 田林县| 南靖县| 措勤县| 当涂县| 宿州市| 马尔康县| 玉田县| 竹山县| 克拉玛依市|