Сравнение и копирование: что можно класть в map и что ломает оператор равенства
Оператор == в Go работает не со всеми типами. Сравнимы булевы, числа, строки, указатели, каналы, интерфейсы и структуры с массивами, все поля которых сравнимы. Несравнимы слайсы, карты и функции — их можно сравнивать только с nil. Отсюда ограничение на ключи карты: ключ обязан быть сравнимым, поэтому слайс ключом быть не может, а массив — может. Самая коварная часть — интерфейсы: == на них компилируется всегда, но паникует в рантайме, если внутри лежит несравнимый динамический тип. То есть карта с ключом any соберётся, а упадёт на первой же вставке слайса. Второе, о чём забывают, — копирование: присваивание структуры копирует её поверхностно, поэтому слайсы и карты внутри останутся общими с оригиналом. Для глубокого сравнения есть reflect.DeepEqual (медленный, для тестов) и типобезопасные slices.Equal и maps.Equal.