此代码使用变量" ok"但它没有定义

时间:2018-05-16 07:41:26

标签: dictionary go indexing

此代码正常运行,但我不了解如何。

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

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

if target, ok := hostTarget[host]; ok {
    ....
}

2 个答案:

答案 0 :(得分:5)

Spec: Index expressions:

中介绍了这一点
  

assignment中使用的map[K]V类型的地图a上的索引表达式或特殊形式的初始化

v, ok = a[x]
v, ok := a[x]
var v, ok = a[x]
var v, ok T = a[x]
     

产生一个额外的无类型布尔值。如果地图中存在关键字ok,则true的值为x,否则为false

例如,这段代码:

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

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

答案 1 :(得分:1)

之前未定义ok,但在您的示例中,您:=将为您定义变量,并指定从map lookup获取的值。