Проверка наличия элемента
Часть раздела Логика и управление потоком путешествия по GO на Coddy — урок 34 из 68.
Теперь, когда вы умеете добавлять элементы в свое множество, следующей важной операцией является проверка того, существует ли конкретный элемент в этом множестве. Именно здесь идиома Go «comma ok» становится невероятно полезной.
Чтобы проверить, существует ли элемент в вашем множестве, используется тот же синтаксис, что и для проверки ключа в карте:
_, ok := colors["red"]
if ok {
fmt.Println("Red is in the set")
} else {
fmt.Println("Red is not in the set")
}Символ подчеркивания _ используется, потому что нам не важно фактическое значение (которое всегда является пустой структурой). Нас интересует только логическая переменная ok, которая сообщает нам, существует ли ключ.
Вы также можете использовать этот паттерн непосредственно в операторе if для более лаконичного кода:
if _, exists := colors["blue"]; exists {
fmt.Println("Blue is in the set")
}Эта проверка членства выполняется быстро и эффективно, используя оптимизированную реализацию map в Go, чтобы предоставить вам преимущества в производительности, характерные для настоящей структуры данных «множество».
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Задание
ЛегкоСоздайте систему проверки участников команды, которая проверяет, входят ли определенные люди в проектную группу, используя идиому множества (set) в Go. Эта задача демонстрирует, как использовать идиому comma ok для проверки членства в множестве.
Вы получите два входных значения:
- Строку, содержащую имена участников команды, разделенные запятыми (например,
"Alice,Bob,Charlie,Diana,Eve") - Строку, содержащую имена людей для проверки, разделенные запятыми (например,
"Bob,Frank,Alice,Grace,Charlie")
Ваша задача:
- Создать множество, используя идиому Go
map[string]struct{}, для хранения участников команды - Разобрать первую входную строку, разделив ее по запятым, чтобы получить имена отдельных участников команды
- Добавить каждого участника команды в ваше множество, используя литерал пустой структуры
{}в качестве значения - Разобрать вторую входную строку, разделив ее по запятым, чтобы получить список людей для проверки
- Для каждого проверяемого человека использовать идиому comma ok
_, ok := teamSet[person]для проверки членства - Вывести результаты проверки для каждого человека:
- Если человек в команде:
"[person] is on the team" - Если человека нет в команде:
"[person] is not on the team"
- Если человек в команде:
- После проверки всех людей вывести сводку:
"Team size: [team_member_count]""People checked: [people_checked_count]""Team members found: [found_count]""Non-team members: [not_found_count]"
Используйте пакет strings для разделения входных строк по запятым. Эта задача демонстрирует, как идиома comma ok обеспечивает безопасный и эффективный способ проверки членства в множестве Go, возвращая как значение, так и логическое значение, указывающее на существование ключа.
Шпаргалка
Чтобы проверить, существует ли элемент в наборе (map), используйте идиому «comma ok»:
_, ok := colors["red"]
if ok {
fmt.Println("Red is in the set")
} else {
fmt.Println("Red is not in the set")
}Символ подчеркивания _ отбрасывает значение, так как нас интересует только логическая переменная ok, которая указывает, существует ли ключ.
Вы также можете использовать этот паттерн непосредственно в операторе if:
if _, exists := colors["blue"]; exists {
fmt.Println("Blue is in the set")
}Попробуйте сами
package main
import (
"fmt"
"strings"
)
func main() {
// Чтение входных данных
var teamMembersInput string
var peopleToCheckInput string
fmt.Scanln(&teamMembersInput)
fmt.Scanln(&peopleToCheckInput)
// Разбор входных строк
teamMembers := strings.Split(teamMembersInput, ",")
peopleToCheck := strings.Split(peopleToCheckInput, ",")
// TODO: Напишите свой код ниже
// Создайте множество, используя map[string]struct{}
// Добавьте членов команды в множество
// Проверьте каждого человека, используя идиому comma ok
// Выведите результаты проверки и сводку
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком выполнения
Switch с использованием `fallthrough`Выход из вложенных цикловПродолжение конкретного циклаОператор `goto`Итоги: Продвинутое управление циклами4Проект: Простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели по значениюПолучатели по указателюВыбор типа получателяМетоды против функцийИтоги: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картИтоги: счетчик частоты слов3Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведение6Идиоматичный Go: Множества
Идиома множества в GoСоздание множестваДобавление в множествоПроверка наличия элементаУдаление из множестваИтерация по множествуИтоги — Уникальные имена пользователей