Go创作者为什么选择不nil视为false?他们的论点是什么?为什么他们认为明确比较值更好nil呢?
例如:
f, err := os.Open(name)
if err != nil {
return err
}
Run Code Online (Sandbox Code Playgroud)
而不是隐含地将nils转换false为许多其他语言:
f, err := os.Open(name)
if err {
return err
}
Run Code Online (Sandbox Code Playgroud)
截至目前,后者将给出:
non-bool err (type error) used as if condition
Run Code Online (Sandbox Code Playgroud)
是否有可靠的来源可以解释为什么这是Go?我在哪里可以找到对此的引用?
有些语言做到了这一点,造成了太多问题.这主要违反了最不惊讶的原则.一些问题是:
true.指向false布尔值的指针将计算为true.所有这些都会产生新的和更大的并发症,即更多的错误.nil将是有效的.比较布尔值nil将是有效的.这造成了语义混乱.更多的错误.if a == '3' && b { .. }你忘记添加比较的情况,所以b总是评估,true即使它不是你想要的.越来越多的错误.人们可能已经考虑过这个问题,而优先考虑错误的代码更好.
可能有一个捷径只是为了将错误传播给调用者,例如:
require f := os.Open(name)
// if the call returns error, return error
Run Code Online (Sandbox Code Playgroud)
编辑:我很高兴地报告Go团队在Go 2中采用了与我建议的非常相似的方法.只是他们使用了关键字check:
check f := os.Open(name)
// if the call returns error run the declared error handler
// which in turn, can return the error or do something else about it.
Run Code Online (Sandbox Code Playgroud)