package main
import "fmt"
//slice本身是沒有數(shù)據(jù),是對(duì)底層array的一個(gè)view养葵。
//slice 底層實(shí)現(xiàn) 有三個(gè)值 ptr指向第一個(gè)值 len長(zhǎng)度? cap代表整個(gè)arr長(zhǎng)度從ptr到結(jié)束
//slice是可以向后擴(kuò)展距芬,不能向前擴(kuò)展解滓,s[i] 不可以超越len(s),向后擴(kuò)展不可以超越底層數(shù)組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的一個(gè)新的array
添加元素時(shí)如果超越cap,系統(tǒng)從新分配更大的底層數(shù)組踊谋,并且拷貝原來數(shù)組元素
go語言有垃圾回收機(jī)制,原來數(shù)組有使用就在后裸,沒有使用瑰钮、將會(huì)被回收
由于值傳遞的關(guān)系,必須接收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))
}