Проверка существования
Освойте идиому comma-ok
«Проверка существования» — бесплатный урок Go Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Отсутствующие ключи возвращают нулевое значение
Когда Вы читаете несуществующий ключ, Go возвращает нулевое значение типа значения, а не ошибку. Для int это 0, а для string — пустая строка.
package main
import "fmt"
func main() {
m := map[string]int{"a": 5}
fmt.Println(m["missing"])
}Проблема неоднозначности
Если возвращено значение 0, как узнать, существует ли ключ со значением 0 или он просто отсутствует? По одному значению это определить нельзя.
Идиома с двумя результатами
Доступ к отображению может возвращать два значения: само значение и логическое значение. Логическое значение равно true, если ключ существует. Это идиома с запятой и признаком успешности.
package main
import "fmt"
func main() {
m := map[string]int{"a": 0}
val, ok := m["a"]
fmt.Println(val, ok)
}Различение отсутствующих ключей
Теперь Вы можете различать эти случаи. Для существующего ключа ok = true, даже если его значение является нулевым.
package main
import "fmt"
func main() {
m := map[string]int{"a": 0}
_, okA := m["a"]
_, okB := m["b"]
fmt.Println("a exists:", okA, "b exists:", okB)
}Проверка перед действием
Распространённый шаблон: используйте идиому с двумя результатами внутри if, чтобы выполнять действие только при наличии ключа.
package main
import "fmt"
func main() {
prices := map[string]int{"pen": 3}
if p, ok := prices["pen"]; ok {
fmt.Println("price is", p)
} else {
fmt.Println("not found")
}
}Игнорирование значения
Если Вам важно только наличие ключа, используйте пустой идентификатор _ для значения.
package main
import "fmt"
func main() {
seen := map[string]bool{"x": true}
_, exists := seen["x"]
fmt.Println("x seen:", exists)
}Подсчёт вхождений
Идиома с двумя результатами хорошо сочетается со счётчиками. Но обратите внимание: даже без проверки m[key]++ работает, потому что отсутствующий ключ начинает с нулевого значения.
package main
import "fmt"
func main() {
counts := map[string]int{}
for _, w := range []string{"a", "b", "a"} {
counts[w]++
}
fmt.Println(counts)
}Безопасные значения по умолчанию
Если ключ отсутствует, можно задать запасной вариант с помощью идиомы с двумя результатами и переменной со значением по умолчанию.
package main
import "fmt"
func main() {
cfg := map[string]string{}
lang, ok := cfg["lang"]
if !ok {
lang = "en"
}
fmt.Println("lang:", lang)
}Идиома с двумя результатами не только для отображений
Форма с двумя значениями также используется при получении данных из каналов и проверке утверждений о типе. Шаблон одинаков: второе значение сообщает об успешности операции.
package main
import "fmt"
func main() {
var i interface{} = "hello"
s, ok := i.(string)
fmt.Println(s, ok)
}Проверка принадлежности множеству
Отображения с логическими значениями или пустыми структурами часто используют для отслеживания принадлежности элементов множеству. Идиома с двумя результатами позволяет однозначно проверить, входит ли элемент в множество.
package main
import "fmt"
func main() {
allowed := map[string]struct{}{"read": {}, "write": {}}
_, ok := allowed["delete"]
fmt.Println("delete allowed:", ok)
}Лучший подход
Всегда используйте идиому с двумя результатами, если нулевое значение может быть допустимым сохранённым значением. Это устраняет неоднозначность и делает намерение кода понятным.
Быстрая проверка
Вы читаете val, ok := m["x"] и получаете val = 0, ok = true. Что это означает?
Итоги
Проверка существования с помощью идиомы с двумя результатами:
- отсутствующие ключи возвращают нулевое значение
val, ok := m[key]сообщает о наличии ключа вok- используйте эту идиому, когда нулевое значение может быть настоящим значением
Часто задаваемые вопросы
Урок «Проверка существования» бесплатный?
Да — полный текст урока «Проверка существования» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Проверка существования»?
Освойте идиому comma-ok Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Проверка существования»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Внутреннее устройство map
- Проверка существования
- Использование map как множества
- Итерация и порядок