Goのメモリ逃逸のあるシナリオ
Go言語では、メモリリークは関数の作成がスタックではなくヒープで行われることを指します。メモリリークの一般的な状況には以下のようなものがあります。1. 関数でポインタを使用してローカル変数を返す:関数でローカル変数を作成してポインタを返した場合、その変数はヒープで割り当てられます。例:“`gofunc createStruct() *MyStruct {
var s MyStruct
return &s}“`2. 参照渡しによって関数パラメータを送信:変数を参照渡しで関数に送信しその内部で変更すると、その変数はヒープで割り当てられます。例:“`gofunc modifySlice(s []int) {
s[0] = 1}func main() {
var nums []int
modifySlice(nums)}“`3. 関数でクロージャを使用する:関数でクロージャを作成してその外部変数にアクセスすると、それらの変数はヒープで割り当てられます。例:“`gofunc getClosure() func() int {
x := 0
return func() int {
x++
return x
}}“`4. ポインタをインターフェイスタイプに格納する:ポインタタイプをインターフェイスタイプに格納すると、そのポインタはヒープで割り当てられます。例:“`gotype MyInterface interface {
DoSomething()}type MyStruct struct {
data *int}func main() {
var i MyInterface
data := 10
i = &MyStruct{data: &data}}“`メモリリークはパフォーマンスの低下を引き起こす可能性があるので、ヒープでメモリを割り当てるには時間がかかります。したがって、効果的なGoコードを書く場合は、不要なメモリリークを避ける必要があります。