副本()運行的DST的至少長度和src,所以你必須初始化dst到所需的長度。
A := []int{1, 2, 3}
B := make([]int, 3)
copy(B, A)
C := make([]int, 2)
copy(C, A)
fmt.Println(A, B, C)
輸出:
[1 2 3] [1 2 3] [1 2]
可以初始化並使用附加()將一個零切片複製所有元件在一行中。
x := append([]T{}, []...)
實施例:
A := []int{1, 2, 3}
B := append([]int{}, A...)
C := append([]int{}, A[:2]...)
fmt.Println(A, B, C)
輸出:
[1 2 3] [1 2 3] [1 2]
與分配+拷貝(),對於大於1,000的元件,使用附加的比較。事實上,低於1000的差異可能會被忽略,除非你有很多切片,否則就是一個經驗法則。
BenchmarkCopy1-4 50000000 27.0 ns/op
BenchmarkCopy10-4 30000000 53.3 ns/op
BenchmarkCopy100-4 10000000 229 ns/op
BenchmarkCopy1000-4 1000000 1942 ns/op
BenchmarkCopy10000-4 100000 18009 ns/op
BenchmarkCopy100000-4 10000 220113 ns/op
BenchmarkCopy1000000-4 1000 2028157 ns/op
BenchmarkCopy10000000-4 100 15323924 ns/op
BenchmarkCopy100000000-4 1 1200488116 ns/op
BenchmarkAppend1-4 50000000 34.2 ns/op
BenchmarkAppend10-4 20000000 60.0 ns/op
BenchmarkAppend100-4 5000000 240 ns/op
BenchmarkAppend1000-4 1000000 1832 ns/op
BenchmarkAppend10000-4 100000 13378 ns/op
BenchmarkAppend100000-4 10000 142397 ns/op
BenchmarkAppend1000000-4 2000 1053891 ns/op
BenchmarkAppend10000000-4 200 9500541 ns/op
BenchmarkAppend100000000-4 20 176361861 ns/op
謝謝大家,真的很傷心,我沒有注意到,切片應該是相同的長度。 –
不一定相同,但是'dst'應該至少與你想複製的許多元素一樣大(對於'src'的完整副本,這意味着'len(dst)> = len(src)')。 – icza
'b:= append([] int {},a ...)' – rocketspacer