第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

結(jié)構(gòu)中的嵌入式接口以非常奇怪的方式運行

結(jié)構(gòu)中的嵌入式接口以非常奇怪的方式運行

Go
交互式愛情 2022-09-26 19:52:54
我發(fā)現(xiàn)很難理解Go在內(nèi)部是如何工作的。在某些情況下,它表現(xiàn)出奇怪的行為。type TestInterface interface {   Walk()}type A struct {}func (a *A) Walk() {   fmt.Println("hello world")}type B struct {   TestInterface}func main() {    var a *A    b := B{}    a.Walk() // This will not panic even though a is nil    b.Walk() // This will panic.}由于 嵌入 ,將以與調(diào)用類似的方式在結(jié)構(gòu)上內(nèi)部調(diào)用方法。bTestInterfaceb.Walk()WalkAa.Walk()為什么一個有效而另一個恐慌呢?
查看完整描述

2 回答

?
MYYA

TA貢獻1868條經(jīng)驗 獲得超4個贊

正如 Go 文檔中提到的Method_declarations,方法綁定到接收器的基本類型。

接收器通過方法名稱前面的額外參數(shù)部分指定。該參數(shù)部分必須聲明一個非可變參數(shù)參數(shù),即接收器。其類型必須是已定義類型 T 或指向已定義類型 T 的指針,T 稱為接收方基類型。接收器基類型不能是指針或接口類型,并且必須在與方法相同的包中定義。該方法稱為綁定到其接收器基類型,并且方法名稱僅在類型 T 或 *T 的選擇器中可見。

所以你的方法綁定到*main。一種類型和類型也 *主要.因此,允許調(diào)用方法。但是,如果您在方法內(nèi)部用作值,它也會崩潰。var aWalk()a

在你的類型中,的默認類型是nil,這就是為什么它很恐慌。您必須將接口實現(xiàn)類型注入以避免恐慌。bBTestInterfaceB

func main() {

    var a *A

    b := B{TestInterface:a}


    fmt.Println(reflect.TypeOf(a), b)

    a.Walk() // This will not panic even though a is nil

    b.Walk() // This will not panic anymore.

}

操場上奔跑


查看完整回答
反對 回復 2022-09-26
?
蕪湖不蕪

TA貢獻1796條經(jīng)驗 獲得超7個贊

由于上面的@mkopriva評論,我以下列方式修改了程序,現(xiàn)在有意義了。這也意味著 Go 中的 nil 具有與之關聯(lián)的類型。


type TestInterface interface {

   Walk()

}


type A struct {

}


func (a *A) Walk() {

   fmt.Println("hello world")

}


type B struct {

   TestInterface

}


func main() {

    var a *A

    

    b := B{TestInterface: a}

    

    // both will not panic

    a.Walk() 

    // TestInterface is still nil as a is nil.

    b.Walk() 

}```


查看完整回答
反對 回復 2022-09-26
  • 2 回答
  • 0 關注
  • 113 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號