Golang 切片 what?

0. 前言

Golang 中切片是什么,为什么需要切片。带着这个疑问我们来看下面这个问题

需求 需要一个数组用于保存学生的成绩,但是学生的个数是不确定的,请问怎么办?

解决方案:切片。切片是对数组的抽象,或者说切片是对数组的引用。前面我们说过,Golang 数组的长度不可改变,上面需求中就不太适用,Golang 提供了一种灵活,功能强悍的内置类型切片,可以把他看做为动态数组,类似于java的list集合一样,与数组相比切片的长度是不固定的,可以添加元素使切片的容量增大。

1. 切片的基本介绍

  • 切片的英文是slice
  • 切片是数组的一个引用,因此切片是引用类型,在进行传递时,遵守引用传递的机制。
  • 切片的使用和数组类似,遍历切片、访问切片的元素和求切片长度len(slice)都一样。
  • 切片的长度是可以变化的,因此切片是一个可以动态变化数组。

语法var identifier []type

案例

func main()
    // 切片的基本使用
    var intArr[5]int=[..]int{1,22,33,66,99}
  
    //1.s1ice就是切片名
    //2.intArr[1:3]表示slice引用到intArr这个数组
    //3.引用intArr数组的起始下标为1,最后的下标为3(但是不包含3)
    slice := intArr[1:3]
    
    fmt.Println("intArr=",intArr)
    fmt.Println("slice的元素是=",s1ice)
    fmt.Print1n("slice的元素个数="1en(slice))
    fmt.Println("slice的容量=”,cap(slice)
}
复制代码

2. 内存展现

image.png

总结:从上面可以看到

  1. slice的确是一个引用类型
  2. slice从底层来说,其实就是一个数据结构(struct?结构体)
type slice struct
    ptr *[2]int
    len int
    cap int
}
复制代码

3. 使用

第一种方式:定义一个切片,然后让切片去引用一个已经创建好的数组

func main()
    slice := intArr[1:3]
    
    fmt.Println("intArr=",intArr)
    fmt.Println("slice的元素是=",s1ice)
    fmt.Print1n("slice的元素个数="1en(slice))
    fmt.Println("slice的容量=”,cap(slice)
}
复制代码

第二种方式:通过make来创建切片,基本语法:var 切片名 []type = make([]type,len,[cap])

参数说明:

  • type:就是数据类型
  • len:大小
  • cap:指定切片容量,可选,如果你分配了cap,则要求cap>=len.

总结:

  • 通过make方式创建切片可以指定切片的大小和容量
  • 如果没有给切片的各个元素赋值,那么就会使用默认值
  • 通过make方式创建的切片对应的数组是由make底层维护,对外不可见,即只能通过slice去访问各个元素

两种方式的区别

第一种方式是直接引用数组,这个数组是事先存在的,程序员是可见的。

第二种方式2通过make来创建切片,make也会创建一个数组,是由切片在底层进行维护,程序员是看不见的。make创建切片的示意图。

本文正在参加技术专题18期-聊聊Go语言框架

猜你喜欢

转载自juejin.im/post/7125702049160757261