0Pricing
Go Academy · Урок

Проверка существования

Освойте идиому 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 — локальная установка не требуется.

Все уроки этого курса

  1. Внутреннее устройство map
  2. Проверка существования
  3. Использование map как множества
  4. Итерация и порядок
← Назад к Go Academy