Asignación de acumulación frente a montón de estructuras en Go, y cómo se relacionan con la recolección de basura

Soy nuevo en Go y estoy experimentando un poco de disonancia colectiva entre la programación basada en la pila de 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 de estilo Python, donde Lo único que vive en la pila son referencias / punteros a objetos en el montón.

Por lo que 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 devolverla.

Si hubiera escrito eso en C, el primero habría puesto un objeto en el montón y el segundo lo habría puesto en la pila. El primero devolvería un puntero al montón, el segundo devolvería un puntero al montón, que se habría evaporado en el momento en que la función había regresado, lo que sería una cosa mala.

Si lo hubiera escrito en Python (o en muchos otros idiomas modernos, excepto C #), el ejemplo 2 no hubiera sido posible.

Entiendo que Go Garbage recopila ambos valores, por lo que las dos formas anteriores están bien.

Citar:

Tenga en cuenta que, a diferencia de C, está perfectamente bien devolver la dirección de una variable local; el almacenamiento asociado con la variable sobrevive después de que la función regresa. De hecho, al tomar la dirección de un literal compuesto se asigna una instancia nueva cada vez que se evalúa, por lo que podemos combinar estas dos últimas líneas.

http://golang.org/doc/effective_go.html#functions

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? ¿Se declara eso en la pila de la misma manera que estaría en C o también va en el montón?

2 - Si el ejemplo 2 se declara en la pila, ¿cómo permanece disponible después de que la función regresa?

3 - Si el ejemplo 2 se declara realmente 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 punteros en este caso?

Respuestas a la pregunta(4)

Su respuesta a la pregunta