package main
import "fmt"
//slice本身是没有数据,是对底层array的一个view。
//slice 底层实现 有三个值 ptr指向第一个值 len长度 cap代表整个arr长度从ptr到结束
//slice是可以向后扩展,不能向前扩展,s[i] 不可以超越len(s),向后扩展不可以超越底层数组cap(s)
func main() {
arr := [...]int{0,1,2,3,4,5,6,7}
s := arr[2:6]
s1 := arr[:6]
s2 := arr[2:]
s3 := arr[:]
fmt.Println(s,s1,s2,s3)
//reslice
s = s[1:]
fmt.Printf("s = %v,len(s)=%d,cap(s)=%d\n",s,len(s),cap(s))
s = s[:4]
fmt.Printf("s = %v,len(s)=%d,cap(s)=%d\n",s,len(s),cap(s))
s4 := append(s,10)
s5 := append(s4,11)
s6 := append(s5,12)
fmt.Println("s4,s5,s6 = ",s4,s5,s6)
/*s5和s6底层不是arr 是view的一个新的array
添加元素时如果超越cap,系统从新分配更大的底层数组,并且拷贝原来数组元素
go语言有垃圾回收机制,原来数组有使用就在,没有使用、将会被回收
由于值传递的关系,必须接收append的返回值
*/
fmt.Println("arr = ",arr)
var d []int//zero vlaue for slice is nil s == nil
for i :=0;i <100 ;i++ {
printSlice(d)
d = append(d,2 * i +1)
}
fmt.Println(d)
}
func printSlice(s []int) {
fmt.Printf("len(s)=%d,cap(s)=%d\n",len(s),cap(s))
}
网友评论