From 2956c03a1f9973b17353ee17ad4e5266a5e1535e Mon Sep 17 00:00:00 2001 From: devlights Date: Wed, 28 May 2025 04:05:35 +0000 Subject: [PATCH] Add slices.NormalFullsliceCopy --- examples/basic/slices/README.md | 43 +++++++-------- examples/basic/slices/examples.go | 1 + .../basic/slices/slice_fullsliceexp_copy.go | 53 +++++++++++++++++++ 3 files changed, 76 insertions(+), 21 deletions(-) create mode 100644 examples/basic/slices/slice_fullsliceexp_copy.go diff --git a/examples/basic/slices/README.md b/examples/basic/slices/README.md index c18f9ca1..ff37af99 100644 --- a/examples/basic/slices/README.md +++ b/examples/basic/slices/README.md @@ -2,24 +2,25 @@ このディレクトリには以下のサンプルがあります。 -| file | example name | note | -| -------------------------------- | ----------------------------- | -------------------------------------------------------------------------- | -| slice_basic01.go | slice_basic01 | スライスについてのサンプル | -| slice_basic02.go | slice_basic02 | スライスについてのサンプル | -| slice_basic03.go | slice_basic03 | スライスについてのサンプル | -| slice_basic04.go | slice_basic04 | スライスについてのサンプル | -| slice_basic05.go | slice_basic05 | スライスについてのサンプル | -| slice_reverse.go | slice_reverse | スライスのリバース処理についてのサンプルです。 | -| slice_append.go | slice_append | スライスの append 利用時についてのサンプルです. | -| slice_pointer.go | slice_pointer | スライスの ポインタ 利用時についてのサンプルです. | -| slice_copy.go | slice_copy | スライスの コピー についてのサンプルです. | -| slice_clear.go | slice_clear | スライスのクリア、及び、nilスライスと空のスライスについてのサンプルです. | -| slice_deepequale.go | silce_deep_equal | スライスに対して reflect.DeepEqual() した場合のサンプルです. | -| slice_concat.go | slice_concat | 2つのスライスの結合に関するサンプルです. | -| slice_remove_all_elements.go | slice_remove_all_elements | スライスの全要素を削除するサンプルです. | -| slice_keep_allocated_memory.go | slice_keep_allocated_memory | スライスのメモリ状態をキープしたままで len を 0 にするサンプルです. | -| slice_nil_append.go | slice_nil_append | Nilなスライスに対して append した場合の挙動についてのサンプル | -| slice_convert_to_array_go117.go | slice_convert_to_array_go117 | Go 1.17 以降で有効な スライス から 配列 への変換方法についてのサンプルです | -| slice_append_special_behavior.go | slice_append_special_behavior | append() を利用する際の特別な挙動に付いてのサンプルです | -| slice_iter_values.go | slice_go123_iter_values | Go 1.23で追加された slices.Values() のサンプルです | -| slice_iter_all.go | slice_go123_iter_all | Go 1.23で追加された slices.All() のサンプルです | +| file | example name | note | +| -------------------------------- | ----------------------------- | ---------------------------------------------------------------------------- | +| slice_basic01.go | slice_basic01 | スライスについてのサンプル | +| slice_basic02.go | slice_basic02 | スライスについてのサンプル | +| slice_basic03.go | slice_basic03 | スライスについてのサンプル | +| slice_basic04.go | slice_basic04 | スライスについてのサンプル | +| slice_basic05.go | slice_basic05 | スライスについてのサンプル | +| slice_reverse.go | slice_reverse | スライスのリバース処理についてのサンプルです。 | +| slice_append.go | slice_append | スライスの append 利用時についてのサンプルです. | +| slice_pointer.go | slice_pointer | スライスの ポインタ 利用時についてのサンプルです. | +| slice_copy.go | slice_copy | スライスの コピー についてのサンプルです. | +| slice_clear.go | slice_clear | スライスのクリア、及び、nilスライスと空のスライスについてのサンプルです. | +| slice_deepequale.go | silce_deep_equal | スライスに対して reflect.DeepEqual() した場合のサンプルです. | +| slice_concat.go | slice_concat | 2つのスライスの結合に関するサンプルです. | +| slice_remove_all_elements.go | slice_remove_all_elements | スライスの全要素を削除するサンプルです. | +| slice_keep_allocated_memory.go | slice_keep_allocated_memory | スライスのメモリ状態をキープしたままで len を 0 にするサンプルです. | +| slice_nil_append.go | slice_nil_append | Nilなスライスに対して append した場合の挙動についてのサンプル | +| slice_convert_to_array_go117.go | slice_convert_to_array_go117 | Go 1.17 以降で有効な スライス から 配列 への変換方法についてのサンプルです | +| slice_append_special_behavior.go | slice_append_special_behavior | append() を利用する際の特別な挙動に付いてのサンプルです | +| slice_iter_values.go | slice_go123_iter_values | Go 1.23で追加された slices.Values() のサンプルです | +| slice_iter_all.go | slice_go123_iter_all | Go 1.23で追加された slices.All() のサンプルです | +| slice_fullsliceexp_copy.go | slice_normal_fullslice_copy | 通常スライス、フルスライス式、copyビルドイン関数を利用した場合のサンプルです | diff --git a/examples/basic/slices/examples.go b/examples/basic/slices/examples.go index 471ebc4e..407dd8d4 100644 --- a/examples/basic/slices/examples.go +++ b/examples/basic/slices/examples.go @@ -34,4 +34,5 @@ func (r *register) Regist(m mapping.ExampleMapping) { m["slice_append_special_behavior"] = AppendSpecialBehavior m["slice_go123_iter_values"] = IterValues m["slice_go123_iter_all"] = IterAll + m["slice_normal_fullslice_copy"] = NormalFullsliceCopy } diff --git a/examples/basic/slices/slice_fullsliceexp_copy.go b/examples/basic/slices/slice_fullsliceexp_copy.go new file mode 100644 index 00000000..f4cf8b35 --- /dev/null +++ b/examples/basic/slices/slice_fullsliceexp_copy.go @@ -0,0 +1,53 @@ +package slices + +import "fmt" + +// NormalFullsliceCopy は、通常スライス、フルスライス式、copyビルドイン関数を利用した場合のサンプルです。 +func NormalFullsliceCopy() error { + // 通常のスライス操作(メモリ共有あり) + { + s := make([]int, 0, 5) + s = append(s, 1, 2, 3, 4, 5) + + s2 := s[:3] + s2 = append(s2, 100) + + s3 := s[3:] + s3 = append(s3, 200) + + fmt.Println(cap(s), cap(s2), cap(s3)) // 5 5 4 + fmt.Println(s, s2, s3) // [1 2 3 100 5] [1 2 3 100] [100 5 200] + } + // フルスライス式(サブスライス作成時に容量制限しメモリ共有を防ぐ) + { + s := make([]int, 0, 5) + s = append(s, 1, 2, 3, 4, 5) + + s2 := s[:3:3] + s2 = append(s2, 100) + + s3 := s[3:len(s):len(s)] + s3 = append(s3, 200) + + fmt.Println(cap(s), cap(s2), cap(s3)) // 5 6 4 + fmt.Println(s, s2, s3) // [1 2 3 4 5] [1 2 3 100] [4 5 200] + } + // copyビルドイン関数の利用 + { + s := make([]int, 0, 5) + s = append(s, 1, 2, 3, 4, 5) + + s2 := make([]int, 3) + copy(s2, s[:3]) + s2 = append(s2, 100) + + s3 := make([]int, 2) + copy(s3, s[3:]) + s3 = append(s3, 200) + + fmt.Println(cap(s), cap(s2), cap(s3)) // 5 6 4 + fmt.Println(s, s2, s3) // [1 2 3 4 5] [1 2 3 100] [4 5 200] + } + + return nil +}