Когда указатели 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 - тип среза