The Go Programming Language Specification
Appending to and copying slices
内置的功能追加和复制协助共同切片 操作。对于这两个函数,结果与参数引用的内存是否重叠无关。
的可变参数函数追加追加零个或多个值x为s S型的,它必须是一个切片类型,并返回生成的切片,也 型S的值x被传递给类型的参数... T 其中,T是S的元素类型,并且适用通过规则 的各个参数。作为一种特殊情况,append还接受第一个参数 ,该参数可分配给类型为[]的字节,第二个参数为字符串类型 ,后跟....此表格附加字符串的字节。
append(s S, x ...T) S // T is the element type of S
如果s的容量不够大,以适应附加的值, 追加分配适合 现有的片元件和所述附加的值既一个新的,足够大的底层数组。否则, 追加重新使用底层数组。
s0 := []int{0, 0}
s1 := append(s0, 2) // append a single element s1 == []int{0, 0, 2}
s2 := append(s1, 3, 5, 7) // append multiple elements s2 == []int{0, 0, 2, 3, 5, 7}
s3 := append(s2, s0...) // append a slice s3 == []int{0, 0, 2, 3, 5, 7, 0, 0}
s4 := append(s3[3:6], s3[2:]...) // append overlapping slice s4 == []int{3, 5, 7, 2, 3, 5, 7, 0, 0}
var t []interface{}
t = append(t, 42, 3.1415, "foo") // t == []interface{}{42, 3.1415, "foo"}
var b []byte
b = append(b, "bar"...) // append string contents b == []byte{'b', 'a', 'r' }
功能拷贝拷贝切片从源SRC为 目的地DST元素,并返回复制的元素的数量。两个参数 必须具有相同的元素类型T,并且必须可分配给 类型为[] T的片段。复制元素的数量是最小的 len(src)和len(dst)。作为一种特殊情况,copy还接受一个 目标参数,该参数可分配给类型为[]字节的字符串类型的源参数 。该表格将字符串中的字节复制到 字节片段中。
copy(dst, src []T) int
copy(dst []byte, src string) int
例子:
var a = [...]int{0, 1, 2, 3, 4, 5, 6, 7}
var s = make([]int, 6)
var b = make([]byte, 5)
n1 := copy(s, a[0:]) // n1 == 6, s == []int{0, 1, 2, 3, 4, 5}
n2 := copy(s, s[2:]) // n2 == 4, s == []int{2, 3, 4, 5, 4, 5}
n3 := copy(b, "Hello, World!") // n3 == 5, b == []byte("Hello")
如果你不希望修改一个切片,你需要的值复制到新的切片。除此之外,我不太了解你的问题。你能展示你期望发生的事情吗? – JimB
JimB,我修改了这个问题,这样你就可以看到我期望的 –