Soy nuevo en Go y estoy experimentando una cierta disonancia congitiva entre la programación basada en pila estilo C donde las variables automáticas viven en la pila y la memoria asignada vive en el montón y la programación basada en la pila al estilo de Python, donde lo único que vive en la pila son referencias/punteros a objetos en el montón.Asignación de estructuras de pila y de montón en Go, y cómo se relacionan con la recolección de basura
Por lo que yo puedo decir, las dos funciones siguientes dan el mismo resultado:
func myFunction() (*MyStructType, error) {
var chunk *MyStructType = new(HeaderChunk)
...
return chunk, nil
}
func myFunction() (*MyStructType, error) {
var chunk MyStructType
...
return &chunk, nil
}
es decir, asignar una nueva estructura y devolverlo.
Si hubiera escrito eso en C, el primero habría puesto un objeto en el montón y el segundo lo hubiera puesto en la pila. El primero devolvería un puntero al montón, el segundo devolvería un puntero a la pila, que se habría evaporado cuando la función regresara, lo que sería una cosa mala.
Si lo hubiera escrito en Python (o en muchos otros idiomas modernos, excepto en C#), el ejemplo 2 no hubiera sido posible.
Supongo que Go garbage recopila ambos valores, por lo que ambos formularios están bien.
Para citar:
Tenga en cuenta que, a diferencia de C, es perfectamente correcto para devolver la dirección de una variable local ; el almacenamiento asociado con la variable sobrevive después de que la función regrese. De hecho, tomar la dirección de un compuesto literal asigna una nueva instancia cada vez que se evalúa, por lo que puede combinar estas dos últimas líneas.
pero plantea un par de preguntas.
1 - En el ejemplo 1, la estructura se declara en el montón. ¿Qué pasa con el ejemplo 2? ¿Eso está declarado en la pila de la misma manera que sería en C o también está en el montón?
2 - Si se declara el ejemplo 2 en la pila, ¿cómo queda disponible después de que la función vuelve?
3 - Si el ejemplo 2 realmente se declara en el montón, ¿cómo es que las estructuras se pasan por valor en lugar de por referencia? ¿Cuál es el punto de los indicadores en este caso?
Excelente gracias. Realmente no me preguntaba "¿para qué sirve punteros?", Era más como "¿qué sentido tiene el puntero cuando los valores parecen comportarse como punteros?", Y de todos modos ese caso es irrelevante. – Joe
Se agradecería una breve explicación del montaje. – ElefEnt