2 回答

TA貢獻2051條經驗 獲得超10個贊
處理它的一種優雅方式(在我看來)是將 getter 添加到用作指針的結構中。這種“技術”也被protobuf生成的 Go 代碼使用,它允許方法調用的自然鏈接,而不必擔心由于nil指針導致的運行時恐慌。
在您的示例中,Bar和Baz結構用作指針,因此用 getter 武裝它們。重點是添加帶有指針接收器的方法,首先必須檢查接收器是否為nil。如果是,則返回結果類型的零值。如果沒有,繼續返回結構的字段:
func (b *Bar) GetBaz() *Baz {
if b == nil {
return nil
}
return b.Baz
}
func (b *Baz) GetBaz() string {
if b == nil {
return ""
}
return b.Baz
}
帶有指針接收器的方法的好處是你可以用nil接收器調用它們。它不會導致運行時恐慌,直到您嘗試引用它們的字段,而我們不會,這就是為什么我們首先檢查接收器是否是nil(最終,接收器充當正常參數 -nil作為指針傳遞永遠不會出錯爭論)。
有了上面的 getter,使用被簡化為這樣,并且在任何這些示例中都不會發生運行時恐慌:
fmt.Println(f3.Bar.GetBaz().GetBaz()) // naturally no panic
fmt.Println(f2.Bar.GetBaz().GetBaz()) // No panic
fmt.Println(f1.Bar.GetBaz().GetBaz()) // No panic
if baz := f2.Bar.GetBaz(); baz != nil {
fmt.Println(baz.GetBaz())
} else {
fmt.Println("something nil")
}
在Go Playground上試一試。
- 2 回答
- 0 關注
- 198 瀏覽
添加回答
舉報