猿问

无法理解 go 函数调用语法

我在这里找到了这个例子:


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???的定义中使用?


我对此感到非常困惑。地鼠们,请帮忙。


UYOU
浏览 195回答 2
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可以实现这种语句。

MYYA

首先:您应该完成 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 写入响应(并且什么也不做)。
随时随地看视频慕课网APP

相关分类

Go
我要回答