zoukankan      html  css  js  c++  java
  • 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不再是同一个底层的数组.

        

        

    不为其他,只为快乐!
  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
  • 原文地址:https://www.cnblogs.com/1521299249study/p/10064345.html
Copyright © 2011-2022 走看看