Ответ
В Go некоторые типы данных по своей структуре содержат указатели на базовые данные. Их часто называют "ссылочными типами", хотя Go всегда передает аргументы в функции по значению. Для этих типов значением является заголовок, содержащий указатель.
К таким типам относятся:
-
Слайсы (
slice
): Слайс — это структура-заголовок, которая содержит указатель на нижележащий массив, а также длину (len
) и вместимость (cap
).// s содержит указатель на массив, len=3, cap=3 s := []int{1, 2, 3}
При передаче слайса в функцию копируется только этот заголовок, а не весь массив. Поэтому изменения элементов слайса внутри функции будут видны снаружи.
-
Карты (
map
): Карта — это указатель на структуру хеш-таблицы в памяти.// m - это указатель на структуру, управляющую хеш-таблицей m := make(map[string]int)
Поэтому карты не нужно передавать по указателю, чтобы изменить их.
-
Каналы (
chan
): Канал, как и карта, является указателем на внутреннюю структуру, которая управляет буфером и очередями горутин.// ch - это указатель на структуру канала ch := make(chan int)
-
Интерфейсы (
interface
): Интерфейс состоит из двух указателей: один указывает на информацию о типе, а другой — на сами данные.// i содержит указатель на данные (строку "hello") и на информацию о типе string var i interface{} = "hello"
-
Функции (
func
): Переменная функционального типа является указателем на код функции. -
Строки (
string
): Строка, как и слайс, является легковесной структурой, содержащей указатель на массив байт и длину. Однако, в отличие от слайсов, строки в Go неизменяемы (immutable).