GO语言学习:切片

1.切片

  切片的长度可以用len获得,容量由cap获得.

  

    s1:=make([]int,5)

    len(s1)可以得到长度为5,cap(s1)可以得到容量为5

    

    s2:=make([]int,5,8)

    len(s2)可以得到长度为5,cap(s2)可以得到容量为8

    

    在s1中我没有用make说明此切片的容量,因此他的容量和长度相等都是5

    在s2中使用make说明了长度,也说明了容量.

    s3:=[]int{1,2,3,4,5,6,7,8}

    s4:=s3[3:6]

    

    上面不使用make声明切片. 切片s3的长度和容量均为8

    至于s4,是把s3中下标从3到5的数据赋值给切片s4

    切片s4中下标0,1,2的值则为s3中下标3,4,5的值      相当于数学上的区间[3,6)  左闭右开

    所以, s4中的值为{4,5,6}

    

    你如果尝试打印出s4[3],你会发现他的值为7,与s3[6]相同。

    原因是切片可以向后延伸,但是不能向前延伸。

    在本质上切片的底层是一个数组,因此s4向后延伸会取到底层数组的值。

    你如果使用cap(s4),会发现他的容量是5,同样的道理,底层是数组,赋值的时候他的容量大小,就是s3的容量减去3,也就是5

    打印s3[3]和s4[0] 会发现值相同

    打印地址代码:fmt.Printf("s3[3]:%d ",&s3[3])

    打印地址代码:fmt.Printf("s4[0]:%d ",&s4[0])

    如果查看地址,会发现他们会在同一个地址块上取值。

    同样,你修改s3[3]的值为11,打印s4[0]的值,会发现变为11

    只有当s4的切片容量大于当前的5时,你会发下,修改s3的值,s4不会在发生变化,地址也不同

    原因是s4容量不够,需要扩展,因此也就和之前的s3不再是同一个底层的数组.

    

    

不为其他,只为快乐!
原文地址:https://www.cnblogs.com/1521299249study/p/10064345.html