为了账号安全,请及时绑定邮箱和手机立即绑定

无法理解 go 函数调用语法

无法理解 go 函数调用语法

Go
UYOU 2021-12-27 17:03:27
我在这里找到了这个例子:func(*myHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request) {    // What does this line do??    if h, ok := route[request.URL.String()]; ok {        h(writer, request)        return    }    io.WriteString(writer, "my server: " + request.URL.String())}我对这一行感到非常困惑:if h, ok := route[request.URL.String()]; ok { h(writer, request) }首先,ok在将其分配给的结果后声明如何在语法上有效route()?第二,如果h是由 返回的route(),如何在ok???的定义中使用?我对此感到非常困惑。地鼠们,请帮忙。
查看完整描述

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可以实现这种语句。



查看完整回答
反对 回复 2021-12-27
?
MYYA

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 写入响应(并且什么也不做)。


查看完整回答
反对 回复 2021-12-27
  • 2 回答
  • 0 关注
  • 154 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信