次のような構造のコードサンプルがいくつかあります。
type point struct {
x, y int
}
func newPoint() *point {
return &point{10, 20}
}
私はC ++のバックグラウンドを持っていますが、エラーのようです。そのような構成のセマンティクスは何ですか?スタックまたはヒープに新しいポイントが割り当てられていますか?
次のような構造のコードサンプルがいくつかあります。
type point struct {
x, y int
}
func newPoint() *point {
return &point{10, 20}
}
私はC ++のバックグラウンドを持っていますが、エラーのようです。そのような構成のセマンティクスは何ですか?スタックまたはヒープに新しいポイントが割り当てられていますか?
回答:
Goはポインタエスケープ分析を実行します。ポインタがローカルスタックをエスケープすると(この場合はエスケープします)、オブジェクトはヒープに割り当てられます。ローカル関数をエスケープしない場合、コンパイラーはスタックに自由に割り当てることができます(ただし、保証はありません。ポインターエスケープ分析で、ポインターがこの関数に対してローカルのままであることを証明できるかどうかによって異なります)。
Golangの「ドキュメントには、ローカル変数へのポインタを返すことは完全に合法であると記載されています。」私がここを読んだように
https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/EYUuead0LsY
コンパイラはあなたがアドレスを返すのを見て、あなたのためにそれをヒープ上に置くように見えます。これはGoの一般的なイディオムです。