И я не могу понять такое объявление переменной:
_, prs := m["example"]
Что именно " _,
" делает и почему они объявили такую переменную вместо
prs := m["example"]
(Я нашел его как часть Go by Example: Maps )
И я не могу понять такое объявление переменной:
_, prs := m["example"]
Что именно " _,
" делает и почему они объявили такую переменную вместо
prs := m["example"]
(Я нашел его как часть Go by Example: Maps )
prs
вероятно, означает «настоящее». Код в вашем примере проверяет наличие или отсутствие записи для "example"
на m
карте.
Ответы:
Это позволяет избежать объявления всех переменных для возвращаемых значений.
Это называется пустым идентификатором .
Как в:
_, y, _ := coord(p) // coord() returns three values; only interested in y coordinate
( другой _
вариант использования - импорт )
Поскольку он отбрасывает возвращаемое значение, это полезно, когда вы хотите проверить только одно из возвращенных значений, как в разделе « Как проверить наличие ключа на карте? » В разделе « Эффективный переход, карта »:
_, present := timeZone[tz]
Чтобы проверить присутствие на карте, не беспокоясь о фактическом значении, вы можете использовать пустой идентификатор, простой символ подчеркивания (
_
).
Пустой идентификатор может быть назначен или объявлен с любым значением любого типа, при этом значение отбрасывается безвредно.
Для проверки присутствия на карте используйте пустой идентификатор вместо обычной переменной для значения.
Как добавляет Jsor в комментариях :
«общепринятый стандарт» - это называть переменные теста принадлежности «ок» (то же самое для проверки, было ли чтение канала действительным или нет)
Это позволяет комбинировать его с тестом:
if _, err := os.Stat(path); os.IsNotExist(err) {
fmt.Printf("%s does not exist\n", path)
}
Вы также найдете это в цикле:
Если вам нужен только второй элемент в диапазоне (значение), используйте пустой идентификатор, подчеркивание, чтобы отбросить первый:
sum := 0
for _, value := range array {
sum += value
}
Компилятор Go не позволит вам создавать переменные, которые вы никогда не используете.
for i, value := range x {
total += value
}
Приведенный выше код вернет сообщение об ошибке «Я объявлен и не используется».
Поскольку мы не используем i внутри нашего цикла, нам нужно изменить его на это:
for _, value := range x {
total += value
}
_
- пустой идентификатор. Это означает, что значение, которое ему следует присвоить, отбрасывается.
Здесь example
отбрасывается значение ключа. Вторая строка кода отбрасывает логическое значение присутствия и сохраняет значение в prs
.
Таким образом, чтобы только проверить наличие на карте, вы можете отбросить значение. Это можно использовать для использования карты как набора.
Пустой идентификатор может использоваться всякий раз, когда синтаксис требует имени переменной, но программная логика не требует, например, чтобы отбросить нежелательный индекс цикла, когда нам требуется только значение элемента.
Выдержка из:
Язык программирования Go (серия профессиональных вычислений Аддисон-Уэсли)
Брайан В. Керниган
Этот материал может быть защищен авторским правом.
Он называется пустым идентификатором и помогает в тех случаях, когда вы хотите отбросить значение, которое будет возвращено, и не ссылаться на него.
Некоторые места, где мы его используем:
Обычно это _,
называется пустым идентификатором. В GO у нас не может быть переменных, которые не используются.
Например, при итерации по массиву, если вы используете value: = range, вам не нужно значение i для итерации. Но если вы опустите значение i, он вернет ошибку. Но если вы объявите i и не использовали его, он также вернет ошибку.
Следовательно, это то место, где мы должны использовать _,
.
Также он используется, когда вы не хотите, чтобы функция возвращала значение в будущем.
Отличный вариант использования неиспользуемой переменной - это ситуация, когда вам нужен только частичный вывод. В приведенном ниже примере нам нужно только напечатать значение (население штата).
package main
import (
"fmt"
)
func main() {
statePopulations := map[string]int{
"California": 39250017,
"Texas": 27862596,
"Florida": 20612439,
}
for _, v := range statePopulations {
fmt.Println(v)
}
}
Неиспользуемая переменная в Голанге запрещена.
Если вы переходили с других языков программирования, вам было бы немного сложно привыкнуть к этому. Но это приводит к более чистому коду. Таким образом, используя a, _
мы говорим, что знаем, что есть переменная, но не хотим ее использовать, и сообщаем компилятору, что не жалуется мне на это. :)