次のような構造のコードサンプルがいくつかあります。
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 の一般的なイディオムです。