golang 定义一个空切片_Golang 切片

1. 为什么需要切片,和数组区别?

数组是定长的,切片是变长的

底层是数组存储

声明

var identifier []type

区分数组是[]中没有数字

var arr = [3]int {1, 2, 3}

fmt.Println(arr)var sl = []int {1, 2, 3}

fmt.Println(sl)

fmt.Printf("类型 arr:%T, sl:%T", arr, sl

输出

[1 2 3]

[1 2 3]

类型 arr:[3]int, sl:[]int

2. 声明

2.1 通过 varidentifier []type

2.2 通过make,如

var slice1 []type = make([]type, len,capacity)

其中 capacity 是容量,可省略;len是长度;需capacity >= len

3. 定义

3.1 直接初始化

var sl = []int {1, 2, 3}

3.2 引用数组、切片

s := []int{0, 1, 2, 3, 4, 5, 6, 7, 8}

var num3 = s[6:7]

4. 添加元素、扩容

4.1 通过下标直接复制

4.2 通过append追加

var nums2 = make([]int, 3, 4)

fmt.Printf("len:%d cap:%d slice:%v", len(nums2), cap(nums2), nums2)

nums2= append(nums2, 1, 2,3)

fmt.Printf("len:%d cap:%d slice:%v", len(nums2), cap(nums2), nums2)

输出

len:3 cap:4 slice:[0 0 0]len:6 cap:8 slice:[0 0 0 1 2 3]

说明:make([]int, 3, 4) 已经给前三个元素复制0了,append的时候在后面追加;当切片长度大于容量时会自动扩容,容量变为原来的二倍

另外,不仅可以扩容单个元素,还可以扩容数组、切片

var num_tmp = []int{5,5,5}

nums2= append(nums2, num_tmp...)

此时注意num_tmp后面需要加...表示添加里面的元素

5. 长度len, 容量cap

var nums2 = make([]int, 3, 4)

nums2[0] = 0nums2[1] = 1nums2[2] = 2fmt.Printf("len:%d cap:%d slice:%v", len(nums2), cap(nums2), nums2)

输出

len:3 cap:4 slice:[0 1 2]

注:此时访问nums2[3]是不行的,因为并未初始化

panic: runtime error: index out of range [3] with length 3

6. copy

num4 := make([]int, len(nums2), 2 *len(nums2))

copy(num4, nums2)

nums2[0] = 1000fmt.Println(num4, nums2)

fmt.Printf("%p, %p", num4, nums2)

拷贝后两个切片指向不同的数组(地址不同),nums2改了其中的一个元素,对num4没影响(深拷贝)

输出

[0 0 0 1 2 3 5 5 5] [1000 0 0 1 2 3 5 5 5]

0xc000098090, 0xc000096000

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值