> В чем разница между сравнением по ссылке и по значению (Go)

Уровень: middle · Роль: backend · Категория: Технические вопросы

Компании: Ozon

Стек: Go

> Пример ответа

В Go разница между сравнением по ссылке и по значению определяется типом данных.

Сравнение по значению происходит для примитивных типов (int, float, bool, string) и структур (struct), если все их поля сравнимы. Оператор == проверяет, равны ли сами данные. Например, две структуры с одинаковыми полями будут равны.

Сравнение по ссылке применяется к указателям, срезам, мапам, каналам и функциям. Здесь == проверяет, указывают ли переменные на одну и ту же область памяти, а не на одинаковое содержимое. Для срезов и мап сравнение напрямую через == запрещено компилятором (кроме сравнения с nil), так как их внутреннее представление включает указатели на данные.

Пример:

GO
a := [3]int{1, 2, 3}
b := [3]int{1, 2, 3}
fmt.Println(a == b) // true - сравнение по значению
c := []int{1, 2, 3}
d := []int{1, 2, 3}
// fmt.Println(c == d) // ошибка компиляции
fmt.Println(&c == &d) // false - разные адреса в памяти

Ключевой нюанс: в Go нет "сравнения по ссылке" в смысле глубокого сравнения содержимого ссылочных типов. Для этого нужно использовать reflect.DeepEqual или писать свою логику.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью