pointers - tipos - ¿Cuándo los punteros de Go se desreferen?
punteros y vectores en c (1)
La expresión del selector (por ejemplo, xf
) hace eso:
Los selectores eliminan automáticamente los punteros a las estructuras. Si
x
es un puntero a una estructura,xy
es una abreviatura de(*x).y
; si el campoy
también es un puntero a una estructura,xyz
es una abreviatura de(*(*x).y).z
, y así sucesivamente. Six
contiene un campo anónimo de tipo*A
, dondeA
también es un tipo de estructura,xf
es un acceso directo para(*xA).f
.
La definición de la operación de indexación especifica que un puntero de matriz se puede indexar:
Para un tipo
A
o*A
dondeA
es un tipo de matriz, o para un tipoS
dondeS
es un tipo de sector
Acabo de comenzar a bucear en Go recientemente y tengo un punto de confusión importante: estoy luchando para entender cuándo es exactamente necesario desreferir un puntero explícitamente.
Por ejemplo, yo sé que el .
el operador se encargará de desreferenciar un puntero
ptr := new(SomeStruct)
ptr.Field = "foo" //Automatically dereferences
¿En qué otros escenarios va hacer esto? Parece, por ejemplo, con matrices.
ptr := new([5][5]int)
ptr[0][0] = 1
No he podido encontrar esto en la especificación, la sección para punteros es muy corta y ni siquiera toca la eliminación de referencias. ¡Cualquier aclaración de las reglas para anular la referencia a los punteros de go sería genial!