赞
踩
动长数组
底层结构:指向底层数组的指针、长度、容量
1.声明
var s []int //=nil,len=cap=0,可进行append,当append时,发现底层数组容量不够,会2倍自动扩容
2.初始化
//切片初始化
s := []int{
1,2,3} //注意等号
s := make([]int,0) //切片不加长度为错, map类型可以 m := make([int]int)
//数组初始化
arr := [...]{
1,2,3}
arr := [3]{
1,2,3}
初始化踩坑:
此时,a!= nil
a := []int{
}
3.切片复制 leetcode:88
nums1 = append(nums1[:], res...) //wrong,nums1[:]从头切到尾
nums1 = append(nums1[:0], res...)
nums1 = res //等号复制为指针复制,指针指向同一个底层数组更改原res切片会影响新nums1切片
copy(nums1,res) //copy为值复制,会在内存上创建新底层数组并拷贝原底层数组,更改原res切片不会影响新nums1切片。注意copy时,nums1的长度得>=res
4.比较
数组是值类型,数组名并不代表指向数组首地址的指针,而代表整个数组。
切片是引用(地址=指针)类型,切片名代表指向底层数组的指针,所以需要make ,当切片作为函数参数时,会复制切片的3个结构体字段,创造切片副本,不会复制底层数组,即将b切片的指针指向原切片的底层数组,在函数中改变切片会影响原切片中的值。
func main() {
a := []int{
1,2,3}
change(a)
fmt.Println(a)
}
func change(b []int) {
b[0] = 4
}
//结果:a=[4,2,3]
5.for range
6.深刻理解golang只有值传递!!!所谓切片是引用传递,只是因为切片是一个结构体,其结构体中有一个指向底层数组的指针字段。
leetcode 08.12
c := make([]int,4,8)//[0000]
fmt.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。