1、切片

切片是数组的一个引用,因此切片是引用类型,在进行传递时,遵守引用类型的机制

切片的使用和数组类似,如遍历切片,访问切片的元素和求切片长度len(slice)都一样。

切片的长度是可以变化的,因此切片是一个可以动态变化的数组

 

2、切片的定义

var 切片名 []类型
比如: var a []int

  

3、切片的使用

3.1 通过引用一个已声明好的数组

func main() {
    intArr := [...]int{0, 1, 2, 3, 4, 5, 6}
    slice := intArr[1:6]
}

slice是一个切片

intArr[1:6]表示引用到intArr这个数组

引用intArr数组的起始下标为1,最后的下标为3(但是不包含3

 

3.2 通过make来创建切片

基本语法:var 切片名 []type = make([]type,len,cap)

参数说明:type就是数据类型,len为长度,cap为容量(可选),cap不小于len

func main() {
    var slice []int = make([]int, 5, 10)
    // slice必须make后才能使用
    slice[0] = 1
    slice[4] = 9
}

通过make方式创建切片可以指定切片的大小和容量

如果没有给切片的各个元素赋值,那么就会使用默认值,

通过make方式创建的切片对应的数组,是由make底层维护,对外不可见,即只能通过slice去访问各个元素

 

3.3 直接指定具体数组,使用原理类似make方式

func main() {
    var slice []string = []string{"jake", "tom", "marry"}
}

  

3.4 切片可以继续切片

func main() {
    var slice []string = []string{"jake", "tom", "marry"}
    slice2 := slice[1:3]
}

   

3.5 append内置函数,可以对切片进行动态追加

func main() {
    var slice []string = []string{"jake", "tom", "marry"}
    slice = append(slice, "Lucy", "Lily")
    fmt.Printf("slice追加后=%v\n", slice)
    var slice2 []string = []string{"jake", "tom", "marry"}
    // 可以追加切片
    slice = append(slice, slice2...)
    fmt.Printf("slice追加切片slice2后=%v\n", slice)
}

输出:

slice追加后=[jake tom marry Lucy Lily]
slice追加切片slice2后=[jake tom marry Lucy Lily jake tom marry]

切片append操作的原理分析:

a. go底层会创建一个新的数组newArr(安装扩容后大小)

b.slice原来包含的元素拷贝到新的数组newArr

c. slice重新引用到newArr

注意newArr是底层来维护的,程序员不可见。

  

3.6 使用copy内置函数来实现切片的拷贝操作

func main() {
    var slice []int = []int{1, 2, 3, 4, 5}
    slice2 := make([]int, 10)
    copy(slice2, slice)
    fmt.Printf("slice2=%v\n", slice2)
}

  

4、stringslice

string底层是一个byte数组,本身是引用这个byte数组的切片 ,因此string也可以进行切片处理

func main() {
    str := "www.baidu.com"
    slice := str[10:]
    fmt.Printf("slice=%v\n", slice)
}

string是不可变的,也就是说不能通过str[0]='z'方式来修改字符串

如果需要修改字符串,可以先将string->[]byte或者[]rune->修改后重新转成string

posted on 2022-03-03 01:16  smile学子  阅读(94)  评论(0编辑  收藏  举报