ホームページ >バックエンド開発 >Golang >Go 構造体のスライスへの追加が再割り当てを行わないと保持されないのはなぜですか?

Go 構造体のスライスへの追加が再割り当てを行わないと保持されないのはなぜですか?

DDD
DDDオリジナル
2024-12-16 11:36:18794ブラウズ

Why Doesn't Appending to a Slice in a Go Struct Persist Without Reassignment?

Go - 構造体内のスライスへの追加

Go では、スライスは参照型であり、基になるオブジェクトへの参照を保持することを意味します。配列。要素を構造体内のスライスに追加し、その結果をスライスに割り当てない場合、関数が戻ったときに変更は保持されません。

次のコードを検討してください。

type MyBoxItem struct {
    Name string
}

type MyBox struct {
    Items []MyBoxItem
}

func (box *MyBox) AddItem(item MyBoxItem) []MyBoxItem {
    return append(box.Items, item)
}

ここで、AddItem メソッドは項目を取得し、それをボックス構造体の項目のスライスに追加します。ただし、このメソッドは結果を Items スライスに割り当て直しません。つまり、メソッドが戻ったときにスライスは変更されません。

これを修正するには、追加操作の結果を元に割り当てる必要があります。スライスに。これを行うには、AddItem メソッドを次のように変更します。

func (box *MyBox) AddItem(item MyBoxItem) {
    box.Items = append(box.Items, item)
}

これで、AddItem メソッドを呼び出すと、構造体内のスライスが更新されます。これを確認するには、Items スライスで len 関数を呼び出します。

item1 := MyBoxItem{Name: "Test Item 1"}
item2 := MyBoxItem{Name: "Test Item 2"}

items := []MyBoxItem{}
box := MyBox{items}

box.AddItem(item1)

fmt.Println(len(box.Items)) // Output: 1

AddItem メソッドは *MyBox タイプに対して定義されていることに注意してください。つまり、このメソッドを box.AddItem(item1) として呼び出す必要があります。 、ボックス構造体へのポインタを引数として渡します。

以上がGo 構造体のスライスへの追加が再割り当てを行わないと保持されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。