March 1

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)).

Такой ответ точно впечатлит интервьюера! 🚀