目的
スライス式, 完全スライス式, copy 関数を使い分ける
検証
~/praprago$ go version
go version go1.23.2 linux/amd64
main.go
package main
import (
"fmt"
)
// go run .
func main() {
fmt.Println(" ======================================== (1)")
PraCompleteSlice1()
fmt.Println(" ======================================== (2)")
PraCompleteSlice2()
fmt.Println(" ======================================== (3)")
PraCompleteSlice3()
}
pra_slice.go
package main
import "fmt"
// /////////////////////////////////////////////////////////
// ///////////////////////////////////////////////////////// (1)
// スライス式はメモリ領域を共有する。
// スライス式において、新しいスライスの容量は、新しいスライスの開始から、元のスライスの容量の最後までである。
//
// 値は格納されていないが容量の範囲内である部分についてもメモリを共有しているので、例えば、新しいスライスで、容量として確保されている箇所に append すると、元のスライスに影響してしまう。
func PraCompleteSlice1() {
mySlice := make([]int, 3, 10)
mySlice[0] = 1
mySlice[1] = 2
mySlice[2] = 3
mySlice = append(mySlice, 4)
mySlice = append(mySlice, 5)
fmt.Println("AAAAAAAAAA_111222")
fmt.Println("len(mySlice): ", len(mySlice), ", cap(mySlice): ", cap(mySlice), ", mySlice: ", mySlice)
newSlice := mySlice[2:4]
fmt.Println("AAAAAAAAAA_222333")
fmt.Println("len(mySlice): ", len(mySlice), ", cap(mySlice): ", cap(mySlice), ", mySlice: ", mySlice)
fmt.Println("len(newSlice): ", len(newSlice), ", cap(newSlice): ", cap(newSlice), ", newSlice: ", newSlice)
newSlice[0] = 300
fmt.Println("AAAAAAAAAA_333444")
fmt.Println("len(mySlice): ", len(mySlice), ", cap(mySlice): ", cap(mySlice), ", mySlice: ", mySlice)
fmt.Println("len(newSlice): ", len(newSlice), ", cap(newSlice): ", cap(newSlice), ", newSlice: ", newSlice)
newSlice = append(newSlice, 500)
fmt.Println("AAAAAAAAAA_444555")
fmt.Println("len(mySlice): ", len(mySlice), ", cap(mySlice): ", cap(mySlice), ", mySlice: ", mySlice)
fmt.Println("len(newSlice): ", len(newSlice), ", cap(newSlice): ", cap(newSlice), ", newSlice: ", newSlice)
newSlice = append(newSlice, 600)
fmt.Println("AAAAAAAAAA_555666")
fmt.Println("len(mySlice): ", len(mySlice), ", cap(mySlice): ", cap(mySlice), ", mySlice: ", mySlice)
fmt.Println("len(newSlice): ", len(newSlice), ", cap(newSlice): ", cap(newSlice), ", newSlice: ", newSlice)
}
// /////////////////////////////////////////////////////////
// ///////////////////////////////////////////////////////// (2)
// 完全スライス式によって、値は格納されていないが容量の範囲内である部分について、どこまでメモリを共有するのかを指定することができる。
func PraCompleteSlice2() {
mySlice := make([]int, 3, 10)
mySlice[0] = 1
mySlice[1] = 2
mySlice[2] = 3
mySlice = append(mySlice, 4)
mySlice = append(mySlice, 5)
fmt.Println("AAAAAAAAAA_111222")
fmt.Println("len(mySlice): ", len(mySlice), ", cap(mySlice): ", cap(mySlice), ", mySlice: ", mySlice)
newSlice := mySlice[2:4:4]
fmt.Println("AAAAAAAAAA_222333")
fmt.Println("len(mySlice): ", len(mySlice), ", cap(mySlice): ", cap(mySlice), ", mySlice: ", mySlice)
fmt.Println("len(newSlice): ", len(newSlice), ", cap(newSlice): ", cap(newSlice), ", newSlice: ", newSlice)
newSlice[0] = 300
fmt.Println("AAAAAAAAAA_333444")
fmt.Println("len(mySlice): ", len(mySlice), ", cap(mySlice): ", cap(mySlice), ", mySlice: ", mySlice)
fmt.Println("len(newSlice): ", len(newSlice), ", cap(newSlice): ", cap(newSlice), ", newSlice: ", newSlice)
newSlice = append(newSlice, 500)
fmt.Println("AAAAAAAAAA_444555")
fmt.Println("len(mySlice): ", len(mySlice), ", cap(mySlice): ", cap(mySlice), ", mySlice: ", mySlice)
fmt.Println("len(newSlice): ", len(newSlice), ", cap(newSlice): ", cap(newSlice), ", newSlice: ", newSlice)
newSlice = append(newSlice, 600)
fmt.Println("AAAAAAAAAA_555666")
fmt.Println("len(mySlice): ", len(mySlice), ", cap(mySlice): ", cap(mySlice), ", mySlice: ", mySlice)
fmt.Println("len(newSlice): ", len(newSlice), ", cap(newSlice): ", cap(newSlice), ", newSlice: ", newSlice)
}
// /////////////////////////////////////////////////////////
// ///////////////////////////////////////////////////////// (3)
// 全くメモリ領域を共有しない新しいスライスを作成したい場合は、copy 関数を使用する。
func PraCompleteSlice3() {
mySlice := make([]int, 3, 10)
mySlice[0] = 1
mySlice[1] = 2
mySlice[2] = 3
mySlice = append(mySlice, 4)
mySlice = append(mySlice, 5)
fmt.Println("AAAAAAAAAA_111222")
fmt.Println("len(mySlice): ", len(mySlice), ", cap(mySlice): ", cap(mySlice), ", mySlice: ", mySlice)
newSlice := make([]int, 2)
copy(newSlice, mySlice[2:4])
fmt.Println("AAAAAAAAAA_222333")
fmt.Println("len(mySlice): ", len(mySlice), ", cap(mySlice): ", cap(mySlice), ", mySlice: ", mySlice)
fmt.Println("len(newSlice): ", len(newSlice), ", cap(newSlice): ", cap(newSlice), ", newSlice: ", newSlice)
newSlice[0] = 300
fmt.Println("AAAAAAAAAA_333444")
fmt.Println("len(mySlice): ", len(mySlice), ", cap(mySlice): ", cap(mySlice), ", mySlice: ", mySlice)
fmt.Println("len(newSlice): ", len(newSlice), ", cap(newSlice): ", cap(newSlice), ", newSlice: ", newSlice)
newSlice = append(newSlice, 500)
fmt.Println("AAAAAAAAAA_444555")
fmt.Println("len(mySlice): ", len(mySlice), ", cap(mySlice): ", cap(mySlice), ", mySlice: ", mySlice)
fmt.Println("len(newSlice): ", len(newSlice), ", cap(newSlice): ", cap(newSlice), ", newSlice: ", newSlice)
newSlice = append(newSlice, 600)
fmt.Println("AAAAAAAAAA_555666")
fmt.Println("len(mySlice): ", len(mySlice), ", cap(mySlice): ", cap(mySlice), ", mySlice: ", mySlice)
fmt.Println("len(newSlice): ", len(newSlice), ", cap(newSlice): ", cap(newSlice), ", newSlice: ", newSlice)
}
~/praprago$ go run .
======================================== (1)
AAAAAAAAAA_111222
len(mySlice): 5 , cap(mySlice): 10 , mySlice: [1 2 3 4 5]
AAAAAAAAAA_222333
len(mySlice): 5 , cap(mySlice): 10 , mySlice: [1 2 3 4 5]
len(newSlice): 2 , cap(newSlice): 8 , newSlice: [3 4]
AAAAAAAAAA_333444
len(mySlice): 5 , cap(mySlice): 10 , mySlice: [1 2 300 4 5]
len(newSlice): 2 , cap(newSlice): 8 , newSlice: [300 4]
AAAAAAAAAA_444555
len(mySlice): 5 , cap(mySlice): 10 , mySlice: [1 2 300 4 500]
len(newSlice): 3 , cap(newSlice): 8 , newSlice: [300 4 500]
AAAAAAAAAA_555666
len(mySlice): 5 , cap(mySlice): 10 , mySlice: [1 2 300 4 500]
len(newSlice): 4 , cap(newSlice): 8 , newSlice: [300 4 500 600]
======================================== (2)
AAAAAAAAAA_111222
len(mySlice): 5 , cap(mySlice): 10 , mySlice: [1 2 3 4 5]
AAAAAAAAAA_222333
len(mySlice): 5 , cap(mySlice): 10 , mySlice: [1 2 3 4 5]
len(newSlice): 2 , cap(newSlice): 2 , newSlice: [3 4]
AAAAAAAAAA_333444
len(mySlice): 5 , cap(mySlice): 10 , mySlice: [1 2 300 4 5]
len(newSlice): 2 , cap(newSlice): 2 , newSlice: [300 4]
AAAAAAAAAA_444555
len(mySlice): 5 , cap(mySlice): 10 , mySlice: [1 2 300 4 5]
len(newSlice): 3 , cap(newSlice): 4 , newSlice: [300 4 500]
AAAAAAAAAA_555666
len(mySlice): 5 , cap(mySlice): 10 , mySlice: [1 2 300 4 5]
len(newSlice): 4 , cap(newSlice): 4 , newSlice: [300 4 500 600]
======================================== (3)
AAAAAAAAAA_111222
len(mySlice): 5 , cap(mySlice): 10 , mySlice: [1 2 3 4 5]
AAAAAAAAAA_222333
len(mySlice): 5 , cap(mySlice): 10 , mySlice: [1 2 3 4 5]
len(newSlice): 2 , cap(newSlice): 2 , newSlice: [3 4]
AAAAAAAAAA_333444
len(mySlice): 5 , cap(mySlice): 10 , mySlice: [1 2 3 4 5]
len(newSlice): 2 , cap(newSlice): 2 , newSlice: [300 4]
AAAAAAAAAA_444555
len(mySlice): 5 , cap(mySlice): 10 , mySlice: [1 2 3 4 5]
len(newSlice): 3 , cap(newSlice): 4 , newSlice: [300 4 500]
AAAAAAAAAA_555666
len(mySlice): 5 , cap(mySlice): 10 , mySlice: [1 2 3 4 5]
len(newSlice): 4 , cap(newSlice): 4 , newSlice: [300 4 500 600]
参考文献