study_go_day4 slice

2019-03-08  本文已影响0人  无风起个浪

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))

}

上一篇下一篇

猜你喜欢

热点阅读