Collections
slices.Clone: 別のバッキング配列を作る
slices.Cloneで複製したsliceを変更しても、元のsliceは書き換わりません。
Sourceclone.go
Go 1.22
package sliceexample
import "slices"
func CloneThenChange(values []int) (original []int, cloned []int) {
cloned = slices.Clone(values)
cloned[0] = 99
return values, cloned
}Testclone_test.go
Go 1.22
package sliceexample
import "testing"
func TestSlicesCloneは別のバッキング配列を作る(t *testing.T) {
original, cloned := CloneThenChange([]int{1, 2})
if original[0] != 1 || cloned[0] != 99 {
t.Fatalf("original = %v, cloned = %v", original, cloned)
}
}01Assertion
このテストで確認できること
- [1, 2]をslices.Cloneする
- cloneの先頭を99に変えても元の先頭は1のままになる
呼び出し境界でsliceの所有権を分けたいときにslices.Cloneを使います。appendが常に独立配列を作るという前提に依存せず、意図をコードへ表せます。
OBSERVED RESULT
original: [1 2]
cloned: [99 2]