亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

測試嵌套結構中的 nil 值

測試嵌套結構中的 nil 值

Go
函數式編程 2021-09-13 14:42:44
我在 go 中有一個深度嵌套的結構。這些是由 json 解組器構建的。然而,這個結構中的相當多的字段是“省略空的”,所以我以一個可以在不同地方有 nill 的結構結束 op。示例(真實的嵌套更深,而且很大:400 行結構):package mainimport "fmt"type Foo struct {    Foo string    Bar *Bar}type Bar struct {    Bar string    Baz *Baz}type Baz struct {    Baz string}func main() {    f1 := Foo{Foo: "f1"}    f2 := Foo{Foo: "f2", Bar: &Bar{Bar: "br2"}}    f3 := Foo{Foo: "f3", Bar: &Bar{Bar: "br3", Baz: &Baz{Baz: "bz3"}}}    fmt.Println(f3.Bar.Baz.Baz) //-> bz3    fmt.Println(f2.Bar.Baz.Baz) //-> panic: runtime error: invalid memory address or nil pointer dereference    fmt.Println(f1.Bar.Baz.Baz) //-> panic: runtime error: invalid memory address or nil pointer dereference        //so far so good, but    //is there a more generic way to do this kind of testing?    if f2.Bar != nil && f2.Bar.Baz != nil {        fmt.Println(f2.Bar.Baz.Baz)    } else {        fmt.Println("something nil")    }}問題是是否有更通用的方法來測試參考樹中的某個節點是否為零?我需要獲得很多不同的項目,編寫所有這些 if 語句會很痛苦。哦,速度令人擔憂。
查看完整描述

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上試一試。


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

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號