0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[golang] スライス式, 完全スライス式, copy 関数を使い分ける

Posted at

目的

スライス式, 完全スライス式, 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]

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?