Проверка наличия элемента
Часть раздела Логика и управление потоком путешествия по 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, обеспечивая преимущества в производительности настоящей структуры данных «множество».
Задание
ЛегкоСоздайте систему проверки участников команды, которая определяет, входят ли определённые люди в команду проекта, используя идиому множества в 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, возвращая и значение, и логическое значение, указывающее, существует ли ключ.
Попробуйте сами
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Сравнение картПовторение — счётчик частоты слов8Проект: простой складской учёт
Обзор проектаПроверка запасов3Интерфейсы (основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование типов интерфейсовПустой интерфейсУтверждения типовПереключатель типовПовторение — формы и поведение6Идиоматический Go: множества
Идиома множества в GoСоздание множестваДобавление элементов в множествоПроверка наличия элементаУдаление элемента из множестваПеребор элементов множестваПовторение — уникальные имена пользователейПотренируйтесь самостоятельно: Онлайн-компилятор Go