Go学习笔记数组切片和容器(五)


func main() {
	//定义数组 数量在类型的前面
	var arr [5] int // 不定义值为0
	arr1 := [3]int{1} // := 必须赋值 最少赋值1位
	arr2 := [...]int{4,5,6,7,8} //...可不规定长度
	//二维数组
	var arr3 [2][5]int
	fmt.Println(arr, arr1, arr2, arr3)

	//不建议这么使用 建议用go的range
	for i:= 0; i < len(arr2); i++ {
		fmt.Println(arr2[i])
	}

    //建议这么使用range
    func itemKey (arr2 [5]int) {
	for key, item := range arr2 {
		fmt.Println(key, item)
	   }
   }

    //数组是值类型 会拷贝引用,不会传递引用 可以用指针的方式 但是不建议 建议使用切片slice
	passByValue(&arr2)

}

//go的数组是值类型 所以都是值传递 可以通过指针去改成引用传递  不建议啊!!!
func passByValue(arr *[5]int) {
	arr[0] = 100000
	for key, value := range arr {
		fmt.Println(key, value)
	}
}

 

 

 

 

 

	a1 := arr[1:]  //从下标1开始 到结束
	a2 := arr[:3]  //从下标0到下标3 不包括下标3 
	a3 := arr[:]   //从下标0到结束
	
	fmt.Println(a1,a2,a3)

//切片
func again() {
	//构造数组
	arr := [...]int{2,3,4,5,6}
	//获取数组切片
	sliarr := arr[1:]
	fmt.Println("切割新的数组 = ",sliarr)
	//变更切片里的值
	sliarr[0] = 200
	fmt.Println("重新赋值新的数组 = ",sliarr)
	//切片只是原来数组的一个view 合并原来的
	fmt.Println("切片只是原来数组的一个view 合并原来的数组",arr)

}

GOROOT=/usr/local/go #gosetup
GOPATH=/Users/liutong/go #gosetup
/usr/local/go/bin/go build -o /private/var/folders/gw/m800qsgs6mvf4zt_tk_y9jwh0000gn/T/___go_build_Slice_go /Users/liutong/go/src/ltstudy/demo_five/Slice.go #gosetup
/private/var/folders/gw/m800qsgs6mvf4zt_tk_y9jwh0000gn/T/___go_build_Slice_go #gosetup
切割新的数组 =  [3 4 5 6]
重新赋值新的数组 =  [200 4 5 6]
切片只是原来数组的一个view 合并原来的数组 [2 200 4 5 6]


//slice只能向后扩展,不能向前扩展
func priSlices() {

	slic := [...]int{0,1,2,3,4,5,6,7}
	//slice本身没有数据,是对底层array的一个view
	s1 := slic[2:5]
	s2 := s1[1:5]
	fmt.Printf("s1=%v, len(s1)=%d, cap(s1)=%d\n", s1,len(s1),cap(s1))
	fmt.Printf("s2=%v, len(s2)=%d, cap(s2)=%d\n", s2,len(s2),cap(s2))
	//向切片里添加数据 append
	s3 := append(s2,10)
	s4 := append(s3,11)
	s5 := append(s4,12)
	s6 := append(s5,13)
	fmt.Println(s3, s4, s5, s6)
	// s4 s5 no longer view arr
	//添加元素时如果超越cap,系统会重新分配更大的底层数组
	//由于值传递的原因,必须接受append的返回值
	//s = append(s, val)
	fmt.Println(slic)  //超过原来下面的cap

}

sli= [2 3 4 5]
sli4= 5
[5 6]
s1=[2 3 4], len(s1)=3, cap(s1)=6
s2=[3 4 5 6], len(s2)=4, cap(s2)=5
[3 4 5 6 10] [3 4 5 6 10 11] [3 4 5 6 10 11 12] [3 4 5 6 10 11 12 13]
[0 1 2 3 4 5 6 10]

 

 

slice取出隐藏部分的实现原理:

slice可以扩展:ptr开关,len长度,cap整个长度  

slice可以像后扩展,不可以向前扩展

s1[i]不可以超过len,向后扩展不可以超过底层数组的cap(s1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值