Какие типы данных в Go являются ссылочными и содержат указатели по своей природе?

Ответ

В Go некоторые типы данных по своей структуре содержат указатели на базовые данные. Их часто называют "ссылочными типами", хотя Go всегда передает аргументы в функции по значению. Для этих типов значением является заголовок, содержащий указатель.

К таким типам относятся:

  1. Слайсы (slice): Слайс — это структура-заголовок, которая содержит указатель на нижележащий массив, а также длину (len) и вместимость (cap).

    // s содержит указатель на массив, len=3, cap=3
    s := []int{1, 2, 3}

    При передаче слайса в функцию копируется только этот заголовок, а не весь массив. Поэтому изменения элементов слайса внутри функции будут видны снаружи.

  2. Карты (map): Карта — это указатель на структуру хеш-таблицы в памяти.

    // m - это указатель на структуру, управляющую хеш-таблицей
    m := make(map[string]int)

    Поэтому карты не нужно передавать по указателю, чтобы изменить их.

  3. Каналы (chan): Канал, как и карта, является указателем на внутреннюю структуру, которая управляет буфером и очередями горутин.

    // ch - это указатель на структуру канала
    ch := make(chan int)
  4. Интерфейсы (interface): Интерфейс состоит из двух указателей: один указывает на информацию о типе, а другой — на сами данные.

    // i содержит указатель на данные (строку "hello") и на информацию о типе string
    var i interface{} = "hello"
  5. Функции (func): Переменная функционального типа является указателем на код функции.

  6. Строки (string): Строка, как и слайс, является легковесной структурой, содержащей указатель на массив байт и длину. Однако, в отличие от слайсов, строки в Go неизменяемы (immutable).