Указатели и ссылки
Есть указатели, а есть ссылки. Ссылки обычно автоматом создаются на срезы, на функции, на каналы. Ссылки не надо разыменовывать. Ссылки можно передавать как значения. Изменение значения по ссылке внутри какой-то функции приведет к изменению значения и вне ее (значения не копируются при передаче ссылки в функцию).
Указатели
Все то же, что и в C. Однако арифметические операции над указателями исключены.
func (test *Test) some() { // передаем по указателю
*test = ... // Разыменование указателя (получение доступа к значению по указателю)
}
Важно понимать, что если метод применяется к указателю и принимает значение, компилятор Go поймет, что нужно сделать разыменование. Если метод применяется к значению и принимает указатель, компилятор Go поймет, что нужно передать указатель.
При обращении к полю структуры, структура разыменовывается автоматически: не надо разыменовывать ее отдельно.
Создание переменных и получение указателей на них
Есть два способа - через оператор & и через new():
type composer struct {
name string
num int
}
test1 := composer{"test", 1} // значение типа
test2 := new(composer) // указатель на значение типа
test2.name, test2.num = "test", 1
test3 := &composer{} // указатель на значение типа
test3.name, test3.num = "test", 1
test4 := &composer{"test", 1} // указатель на значение типа
Операторы работы с указателями
pi := &i // взятие указателя
i = *pi // разыменоновывание указателя (еще называется доступом к содержимому или косвенной адресацией)
*int - этот тип называется "указатель на int"
Ссылки
Каналы, отображения и срезы в языке Go создаются с помощью функции make()
, которая всегда возвращает ссылку. Ссылка действует почти так же, как и указатель. Однако, ссылки не требуется разыменовывать (в большинстве случаев не требуется добавлять звездочку в конец).
Last updated