为什么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?事实,请。
这个决定背后的逻辑是什么?
答案 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时不投射类型会导致更好的代码质量。