Golang中的Slice(切片)

//Slice切片
a :=[10]int{1,2,3,4,5,6,7,8,9,0}
fmt.Println(a)
b := a[2:6]
fmt.Println(b)
c := a[:5]
fmt.Println(c)
d := a[3:]
fmt.Println(d)
e := a[4:len(a)]
fmt.Println(e)
//
/*Slice的另外一种声明方法,可以指定他的完整属性
make(类型,长度,容量),容量可以不规定
Slice的容量是可变的,假如声明数组容量为10,则数组容量在10个以内,则内存不会重新分配
如果内存地址增加到第11个,则内存地址会增加到20个*/
f:=make([]int,5,10)
fmt.Println(len(f),cap(f))

g:=make([]int, 3, 6)
fmt.Printf(“%p\n”,g)
g=append(g, 1,1,1)
//如果apped的内容不超过原slice的容量,则内存地址不变
fmt.Printf(“%p %v\n”,g,g)
g=append(g, 2,2,2)
//如果append的内容超过原slice的容量,则会新增一块内存地址,并将原slice内容拷贝过来
fmt.Printf(“%p %v\n”,g,g)

h:=[]int{1,2,3,4,5}
//h1 h2都是从同一块slice中取出来的,都属于同一块内存地址
//所以对h1的修改会影响到同一块内存地址的数组
h1:=h[2:5]
h2:=h[2:3]
h3:=h[2:4]
fmt.Println(h,h1,h2,h3)
h1[0] = 99
fmt.Println(h,h1,h2,h3)
//因为h3 append的内容已经超出原来h设计容量
//h的容量为5,h3从第三位开始取,取到第四位
//之后h3append了4位,已经超出h原来的容量
//则h3会被新开辟一块内存地址
fmt.Printf(“append前:\nh :%p\nh3:%p\n”, h,h3)
h3=append(h3, 0,0,0,0)
h3[1]=88
fmt.Println(h,h1,h2,h3)
fmt.Printf(“append后:\nh :%p\nh3:%p\n”, h,h3)

fmt.Println(“数组拷贝:”)
i1:=[]int{1,1,1,1,1,1}
i2:=[]int{0,0,0}
i3:=[]int{2,2,2,2,2,2}
copy(i2,i1)
fmt.Println(i2)
copy(i3[2:4],i1[2:4])
fmt.Println(i3)

j:=[]int{1,2,3,4,5,6,7,8,9}
jlen:=len(j)
j1:=make([]int,jlen,jlen)
copy(j1,j)
fmt.Println(j,j1)
fmt.Printf(“%p %p\n”, j,j1)

k:=[]int{1,2,3,4,5,6,7,8,9}
k1:=k[:len(k)]
k2:=k
fmt.Println(k,k1,k2)
fmt.Printf(“%p %p %p \n”, k,k1,k2)