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

时间:2016-04-26 02:01:54

标签: go

为什么Go创作者选择不将<head> <style> html,body { height: 100%; text-align: center; color: #222; margin: 0 } #expansion { float:left; position: relative; top: 50%; -webkit-transform: translateY(-50%); transform: translateY(-50%); width: 28px; height: 28px; padding: 5px; margin: auto; color: #666; font-size: 150% } #expansion:hover { background: #222; color: #eee; cursor:pointer; } </style> </head> <body> <div id="expansion">+</div> <nav> <ul> <li><span>one</span> </li> <li><span>two</span> </li> </ul> </nav> <section id="description" class="removed"> <h1>about web</h1> <p> WEB is a reference of... </p> </section> </body>视为nil?为什么他们认为明确地将值与false进行比较更好?

E.g:

nil

与其他许多语言一样隐含地将f, err := os.Open(name) if err != nil { return err } 转换为nil

false

截至目前,后者将给出:

f, err := os.Open(name)
if err {
    return err
}

是否有一个可靠的来源可以解释为什么这是Go?事实,请。

这个决定背后的逻辑是什么?

2 个答案:

答案 0 :(得分:7)

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

  • 所有非零值将评估为true。指向false布尔值的指针将计算为true。所有这些都会产生新的和更大的并发症,即更多的错误。
  • nil分配布尔值是有效的。将布尔值与nil进行比较将是有效的。这造成了语义混乱。更多错误。
  • 代码会更难阅读,因为它隐藏了意图。如果要检查布尔值或断言某些其他类型变量的“非零”,则无法从表达式中判断出来。更多错误。
  • 表达式中的比较操作中省略的操作数可以正常编译,从而使识别错误更加困难。考虑if a == '3' && b { .. }某种情况,您忘记添加比较,以便b始终评估为true,即使它不是您想要的。越来越多的错误。

Go人们可能已经考虑过这个问题,并且优先考虑错误的代码更好。

虽然只是为了将错误传播给调用者,但可能有一个快捷方式,例如:

require f := os.Open(name)
// if the call returns error, return error 
编辑:我很高兴在Go 2中报告Go团队采用了a very similar approach to what I suggested。只是他们使用关键字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.

答案 1 :(得分:1)

虽然我在golang文档或开发人员讨论中找不到确切的原因,但最接近的原因只是缺少值(nil)不应该被解释为false。这也符合golang是一种非常固执的语言这一事实​​,并且其作者认为在评估true / false时不投射类型会导致更好的代码质量。