Pilha versus alocação de heap de estruturas no Go e como elas se relacionam com a coleta de lixo

Eu sou novo em Go e estou experimentando um pouco de dissonância congitiva entre a programação baseada em pilha estilo C onde as variáveis ​​automáticas vivem na pilha e alocam vidas de memória no heap e em programação baseada em pilha no estilo Python onde A única coisa que vive na pilha são referências / ponteiros para objetos no heap.

Tanto quanto eu posso dizer, as duas funções seguintes dão a mesma saída:

func myFunction() (*MyStructType, error) {
    var chunk *MyStructType = new(HeaderChunk)

    ...

    return chunk, nil
}


func myFunction() (*MyStructType, error) {
    var chunk MyStructType

    ...

    return &chunk, nil
}

isto é, aloque uma nova estrutura e retorne-a.

Se eu tivesse escrito isso em C, o primeiro teria colocado um objeto na pilha e o segundo teria colocado na pilha. O primeiro retornaria um ponteiro para o heap, o segundo retornaria um ponteiro para a pilha, que teria evaporado no momento em que a função retornasse, o que seria uma Coisa Má.

Se eu tivesse escrito em Python (ou muitas outras linguagens modernas, exceto C #), o exemplo 2 não teria sido possível.

Eu entendo que Go garbage recolhe ambos os valores, então ambos os formulários acima estão bem.

Citar:

Note que, ao contrário do C, é perfeitamente correto retornar o endereço de uma variável local; o armazenamento associado à variável sobrevive após a função retornar. De fato, pegar o endereço de um literal composto aloca uma instância nova a cada vez que ele é avaliado, para que possamos combinar essas duas últimas linhas.

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

Mas isso levanta algumas questões.

1 - No exemplo 1, a estrutura é declarada no heap. E quanto ao exemplo 2? Isso é declarado na pilha da mesma forma que seria em C ou também na pilha?

2 - Se o exemplo 2 for declarado na pilha, como ele fica disponível após a função retornar?

3 - Se o exemplo 2 for realmente declarado no heap, como as estruturas são passadas por valor e não por referência? Qual é o ponto de ponteiros neste caso?

questionAnswers(4)

yourAnswerToTheQuestion