Menu
Coddy logo textTech

Проверка наличия элемента

Часть раздела Логика и управление потоком путешествия по 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, чтобы предоставить вам преимущества в производительности, характерные для настоящей структуры данных «множество».

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

challenge icon

Задание

Легко

Создайте систему проверки участников команды, которая проверяет, входят ли определенные люди в проектную группу, используя идиому множества (set) в Go. Эта задача демонстрирует, как использовать идиому comma ok для проверки членства в множестве.

Вы получите два входных значения:

  • Строку, содержащую имена участников команды, разделенные запятыми (например, "Alice,Bob,Charlie,Diana,Eve")
  • Строку, содержащую имена людей для проверки, разделенные запятыми (например, "Bob,Frank,Alice,Grace,Charlie")

Ваша задача:

  1. Создать множество, используя идиому Go map[string]struct{}, для хранения участников команды
  2. Разобрать первую входную строку, разделив ее по запятым, чтобы получить имена отдельных участников команды
  3. Добавить каждого участника команды в ваше множество, используя литерал пустой структуры {} в качестве значения
  4. Разобрать вторую входную строку, разделив ее по запятым, чтобы получить список людей для проверки
  5. Для каждого проверяемого человека использовать идиому comma ok _, ok := teamSet[person] для проверки членства
  6. Вывести результаты проверки для каждого человека:
    • Если человек в команде: "[person] is on the team"
    • Если человека нет в команде: "[person] is not on the team"
  7. После проверки всех людей вывести сводку:
    • "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
	// Выведите результаты проверки и сводку
	
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком