此代码使用变量"ok"但未定义

P H*_*ans 1 indexing dictionary go

这段代码正在运行,但我不明白如何.

在下面的代码中,hostProxy [host]可能包含也可能不包含函数.我不明白变量"ok"是如何定义的,或者它是如何获得它的值的.它没有在此行之前定义.

if fn, ok := hostProxy[host]; ok {
    fn.ServeHTTP(w, r)
    return
}

if target, ok := hostTarget[host]; ok {
    ....
}
Run Code Online (Sandbox Code Playgroud)

icz*_*cza 5

这在Spec:Index表达式中有所介绍:

map[K]V用于特殊表单赋值或初始化的类型的映射a上的索引表达式

v, ok = a[x]
v, ok := a[x]
var v, ok = a[x]
var v, ok T = a[x]
Run Code Online (Sandbox Code Playgroud)

产生一个额外的无类型布尔值.的值oktrue如果该键x存在于地图,和false其它.

所以例如这段代码:

if fn, ok := hostProxy[host]; ok {
    fn.ServeHTTP(w, r)
    return
}
Run Code Online (Sandbox Code Playgroud)

意味着hosthostProxy映射中获取与键相关联的值,在fn变量中创建和存储值,以及变量中的结果(是否在映射中找到键)ok.并且此ok变量(将是类型bool)用作if语句的条件.因此,如果host密钥位于hostProxy地图中,则会继续使用它.