2 回答
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.
}
在操場上奔跑
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()
}```
- 2 回答
- 0 關注
- 113 瀏覽
添加回答
舉報
