为什么Go创作者选择不将"nil"视为"false"?

san*_*mai -1 go

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?我在哪里可以找到对此的引用?

Sed*_*glu 9

有些语言做到了这一点,造成了太多问题.这主要违反了最不惊讶的原则.一些问题是:

  • 所有非零值都将评估为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)