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 关注
- 153 浏览
添加回答
举报