Go 切片的概念、内存布局及使用

切片的基本概念

  • 先看一个需求:我们需要一个数组用于保存学生的成绩,但是学生的个数是不确定的,请问怎么办?解决方案:使用切片
  • 切片的基本介绍
    • 切片的英文是 slice
    • 切片是数组的一个引用,因此切片是引用类型,在进行传递时,遵守引用传递的机制。
    • 切片的使用和数组类似,遍历切片、访问切片的元素和求切片长度 len(slice)都一样。
    • 切片的长度是可以变化的,因此切片是一个可以动态变化数组
    • 切片定义的基本语法:
      • var 切片名 []类型
      • 比如:var a [] int
  • 演示案例:
var intArr [5]int = [...]int{1, 22, 33, 66, 99}
//声明/定义一个切片
slice := intArr[1:3]
  • slice 就是切片名
  • intArr[1:3] 表示 slice 引用到intArr这个数组 
  • 引用intArr数组的起始下标为 1 , 最后的下标为3(但是不包含3) 
//演示切片的基本使用
var intArr [5]int = [...]int{1, 22, 33, 66, 99}
//声明/定义一个切片
slice := intArr[1:3] 
fmt.Println("intArr=", intArr)
fmt.Println("slice 的元素是 =", slice) //  22, 33
fmt.Println("slice 的元素个数 =", len(slice)) // 2
fmt.Println("slice 的容量 =", cap(slice)) // 切片的容量是可以动态变化 


切片在内存中形式

  • 画出前面的切片内存布局

  • 总结:
  • 从上面可以看到slice的确是一个引用类型
  • slice 从底层来说,其实就是一个数据结构(struct结构体)
type slice struct {
   ptr  *[2]int
   len  int
   cap  int
}

 


切片的使用

  • 第一种方式:
    • 定义一个切片,然后让切片去引用一个已经创建好的数组,比如前面的案例就是这样的


  • 第二种方式:
    • 通过 make 来创建切片.
    • 基本语法:
      • var 切片名 []type = make([]type, len, [cap])
      • 参数说明: type: 就是数据类型 len : 大小 cap :指定切片容量,可选, 如果你分配了 cap,则要求 cap>=len.


  • 演示案例:
//演示切片的使用 make
var slice []float64 = make([]float64, 5, 10)
slice[1] = 10
slice[3] = 20
//对于切片,必须make使用.
fmt.Println(slice)
fmt.Println("slice的size=", len(slice))
fmt.Println("slice的cap=", cap(slice))
  • 输出结果:

  • 对应内存图:

  • 对上面代码的小结:
    • 通过 make 方式创建切片可以指定切片的大小和容量
    • 如果没有给切片的各个元素赋值,那么就会使用默认值    [ int , float=> 0 string =>”” bool =>false]
    • 通过 make 方式创建的切片对应的数组是由 make 底层维护,对外不可见,即只能通过 slice 去访问各个元素.

  • 第 3 种方式:
    • 定义一个切片,直接就指定具体数组,使用原理类似 make 的方式
var strSlice []string = []string{"tom", "jack", "mary"}
fmt.Println("strSlice=", strSlice)
fmt.Println("strSlice size=", len(strSlice)) 
fmt.Println("strSlice cap=", cap(strSlice))
  • 输出结果:


  • 方式 1 和方式 2 的区别
    • 方式1是直接引用数组,这个数组是事先存在的,程序员是可见的。
    • 方式2是通过make来创建切片,make也会创建一个数组,是由切片在底层进行维护,程序员是看不见的。
      • make创建切片的示意图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值