Retorne o ponteiro para a estrutura local

85

Vejo alguns exemplos de código com construções como esta:

type point struct {
  x, y int
}

func newPoint() *point {
  return &point{10, 20}
}

Tenho experiência em C ++ e parece um erro para mim. Quais são as semânticas de tal construção? O novo ponto está alocado na pilha ou heap?

demi
fonte
1
Uma pergunta semelhante (os links de resposta para a documentação): stackoverflow.com/questions/12098435/…
Denys Séguret
@DenysSéguret não é semelhante
mangusta

Respostas:

109

Go realiza análise de escape de ponteiro. Se o ponteiro escapar da pilha local, o que acontece neste caso, o objeto é alocado na pilha. Se ele não escapar da função local, o compilador estará livre para alocá-lo na pilha (embora não ofereça garantias; depende se a análise de escape do ponteiro pode provar que o ponteiro permanece local para esta função).

Lily Ballard
fonte
13
Aqui está uma postagem de blog (isenção de responsabilidade: que eu escrevi) que examina a análise de fuga de Go um pouco mais de perto: scvalex.net/posts/29
scvalex
@LilyBallard não recebeu totalmente sua resposta. Você quer dizer que provar o fato de um ponteiro de escape é sempre possível, ao passo que provar o fato de NÃO escapar não é?
mangusta