Этот код использует переменную "ОК", но она не определена - PullRequest
0 голосов
/ 16 мая 2018

Этот код работает, но я не понимаю, как.

В приведенном ниже коде hostProxy [host] может содержать или не содержать функцию. Я не понимаю, как определяется переменная «ОК» или как она получает свое значение. Он не определен перед этой строкой.

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

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

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Да ok не определено ранее, но в вашем примере у вас есть :=, который будет определять переменные для вас под капотом и назначать значения, полученные из map lookup.

0 голосов
/ 16 мая 2018

Это рассматривается в Spec: индексные выражения:

Индексное выражение на карте a типа map[K]V, используемое в назначении илиинициализация специальной формы

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переменная.И эта переменная ok (которая будет иметь тип bool) используется в качестве условия оператора if.Поэтому, если ключ host находится на карте hostProxy, он идет вперед и использует его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...