说明(请读内联注释):
package main
import (
"fmt"
)
var a = make([]int, 7, 8)
func Test(slice []int) {
slice[6] = 10
slice = append(slice, 100)
fmt.Println(slice, len(slice), cap(slice), " << Test 1")
slice = append(slice, 200)
slice[6] = 13
fmt.Println(slice, len(slice), cap(slice), " << Test 2")
}
func main() {
for i := 0; i < 7; i++ {
a[i] = i
}
fmt.Println(a, len(a), cap(a))
Test(a)
fmt.Println(a, len(a), cap(a))
fmt.Println(a[:cap(a)], len(a), cap(a))
}
输出:
[0 1 2 3 4 5 6] 7 8
[0 1 2 3 4 5 10 100] 8 8 << Test 1
[0 1 2 3 4 5 13 100 200] 9 16 << Test 2
[0 1 2 3 4 5 10] 7 8
[0 1 2 3 4 5 10 100] 7 8
参考文献1:https://blog.golang.org/go-slices-usage-and-internals
这篇文章介绍了Golang中slice的用法和内部实现原理,对于IT技术人员来说是一篇很有价值的文章。
func AppendByte(slice []byte, data ...byte) []byte {
m := len(slice)
n := m + len(data)
if n > cap(slice) {
newSlice := make([]byte, (n+1)*2)
copy(newSlice, slice)
slice = newSlice
}
slice = slice[0:n]
copy(slice[m:n], data)
return slice
}
Test
中这些 slice 的链条。 - Izana