副本()运行的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