1 回答

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
}
- 1 回答
- 0 關注
- 174 瀏覽
添加回答
舉報