Slice в go в ключ map?
🔥 Хитрый вопрос на собеседовании по Go: ключи в map!
Один из частых вопросов на собеседованиях:
🧐 «Какие типы можно использовать в качестве ключей в map?»
Большинство кандидатов уверенно отвечают: "Те, которые можно сравнивать" – int, string, bool, структуры без слайсов и мап.
Но вот ловушка от опытного интервьюера (например, Подольского):
💥 «А что делать, если нам ОЧЕНЬ хочется использовать слайс в качестве ключа?»
❌ Нельзя! Ведь слайс – это не сравниваемый тип. Он содержит указатель на массив, длину и ёмкость, и напрямую Go сравнивать их не умеет.
Но есть трюк! 🧠 Можно превратить слайс в массив фиксированной длины, а массивы – это уже сравниваемые типы.
package main import "fmt" func main() { m := make(map[[3]int]string) // Ключ - массив фиксированной длины key := [3]int{1, 2, 3} // Используем массив, а не слайс m[key] = "Hello, map!" fmt.Println(m[key]) // Выведет: Hello, map! }
⚡️ Почему это работает?
Массивы сравниваются постоянно и предсказуемо – Go проверяет каждый элемент. Отличаются массивы только тогда, когда хотя бы один из элементов отличается.
А вот если использовать слайс? Попробуй сам:
package main func main() { m := make(map[[]int]string) // Ошибка компиляции! }
💡 Вывод:
👉 Хотите хранить слайс в map? Превратите его в массив фиксированной длины!
👉 Или используйте string как ключ – например, сериализовав слайс в строку (fmt.Sprintf("%v", slice)).