2 回答
TA贡献1995条经验 获得超2个赞
看看Go 之旅中的这个页面。它解释说:
就像for,该if语句可以以在条件之前执行的短语句开始。
鉴于你的例子:
h, ok := route[request.URL.String()]; ok { ... }
简短的声明是h, ok := route[request.URL.String()]。在;后商标的简短声明的结尾。在ok随后的条件。如果为真,则执行代码块{...}。在该代码块中,您可以使用在短语句中分配的所有变量。
首先,ok在将其分配给的结果后声明如何在语法上有效route()?
ok赋值后不声明。它是一个布尔值,用于条件中。
第二,如果h is returned byroute() , how can it be used in the definition ofok`???
这不是 的定义ok。它是if语句的代码块。
考虑这种替代的,几乎等效的写作风格:
h, ok := route[request.URL.String()]
if ok {
h(writer, request)
return
}
这很清楚,对吧?我们只是将原始代码拆分为两步。但这不一样。以这种方式编写时,h和ok变量在if语句之后可见。这是不可取的。将变量的可见性(也称为live time)最小化是一种很好的做法。变量可见的时间越长,它可能被意外误用的漏洞窗口就越长。Go 的这种语法真是太棒了,天才,而且我不知道任何其他语言if可以实现这种语句。
TA贡献1868条经验 获得超4个赞
首先:您应该完成 Go Tour - 特别是地图部分:https : //tour.golang.org/moretypes/16
这里的“逗号,好的”习语旨在检查映射中是否存在密钥。对不存在的键进行查找会导致恐慌(并且可能会使您的应用程序崩溃)。
if h, ok := route[request.URL.String()]; ok { h(writer, request) }
如果
request.URL.String()
存在,设置h
并设置ok
为true。如果
ok
为真,则调用函数h
。否则,将 URL 写入响应(并且什么也不做)。
- 2 回答
- 0 关注
- 154 浏览
添加回答
举报