Когда указатели Go разыскивают себя
Я только недавно начал погружаться в Go, и у меня есть одна основная точка смятения: я изо всех сил пытаюсь понять, когда именно нужно явно разыменовать указатель.
Например, я знаю, что оператор .
будет обрабатывать разыменование указателя
ptr := new(SomeStruct)
ptr.Field = "foo" //Automatically dereferences
В каких других сценариях это делается? Кажется, например, с массивами.
ptr := new([5][5]int)
ptr[0][0] = 1
Мне не удалось найти это в спецификации, раздел для указателей очень короткий и даже не касается разыменования. Любое разъяснение правил разыменования go-указателей было бы здорово!
Ответы
Ответ 1
выражение селектора (например, x.f
) делает следующее:
Селекторы автоматически указатели разыменования для структур. Если x
является указателем на структуру, x.y
является сокращением для (*x).y
; если поле y
также является указателем на структуру, x.y.z
является сокращение для (*(*x).y).z
и т.д. Если x
содержит анонимное поле типа *A
, где A
также является структурным типом, x.f
является ярлыком для (*x.A).f
.
Определение операции индексирования указывает, что указатель массива может быть проиндексирован:
Для a типа A
или *A
, где A
- тип массива, или для a типа S
, где S
- тип среза