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

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

簡潔的 nil 檢查結構字段指針?

簡潔的 nil 檢查結構字段指針?

Go
米琪卡哇伊 2022-01-10 10:51:35
假設我有這個結構:type Foo struct {    Bar        *string          `json:"bar"`    Baz        *int64           `json:"baz,omitempty"`    Qux        *string          `json:"qux"`    Quux       string           `json:"quux"`}解組 json 后,我檢查 nil ,如下所示:switch {case f.Bar == nil:    return errors.New("Missing 'bar'")case f.Baz == nil:    f.Baz = 42case f.Qux == nil:    return errors.New("Missing 'qux'")}(或通過一系列if語句等...)我知道我可以將所有nil比較放在一個逗號分隔中case,但每張nil支票都會有不同的回報。我的問題:是否有一種不那么冗長的方法來進行 nil 檢查?
查看完整描述

1 回答

?
慕哥9229398

TA貢獻1877條經驗 獲得超6個贊

向您提出的一個問題:您想獲得多少的冗長?因為你想在不同的條件下做不同的事情(不同的領域是nil)。您的代碼包含這些不同的內容和不同的條件。除此之外,代碼中“冗余”的只是switchandcase關鍵字。你想把他們排除在外嗎?因為其余的不是“冗余的”,所以它們是必需的。


另請注意,在 Go 中case即使沒有 a 也不會失敗break(與其他語言不同),因此在上面的示例中 if f.Bazis nil,您將其設置為42并且f.Qux不會被檢查(因此error將返回no ),但 iff.Baz是 non - niland f.Quxis nil,error將返回一個。我知道這只是一個例子,但請記住這一點。error如果你使用 a ,你應該先處理s switch!或者使用if語句,然后無論字段檢查的順序如何,都會檢測并返回錯誤。


您的代碼switch干凈高效。如果你想讓它不那么冗長,可讀性(和性能)會受到影響。


您可以使用輔助函數來檢查指針值是否為nil:


func n(i interface{}) bool {

    v := reflect.ValueOf(i)

    return v.Kind() == reflect.Ptr && v.IsNil()

}

并使用它:


func check(f *Foo) error {

    switch {

    case n(f.Bar):

        return errors.New("Missing 'bar'")

    case n(f.Qux):

        return errors.New("Missing 'qux'")

    case n(f.Baz):

        x := int64(42)

        f.Baz = &x

    }

    return nil

}

或使用if語句:


func check2(f *Foo) error {

    if n(f.Bar) {

        return errors.New("Missing 'bar'")

    }

    if n(f.Qux) {

        return errors.New("Missing 'qux'")

    }

    if n(f.Baz) {

        x := int64(42)

        f.Baz = &x

    }

    return nil

}


查看完整回答
反對 回復 2022-01-10
  • 1 回答
  • 0 關注
  • 174 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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