go slice探究


前言


一、代码

package main

import "fmt"

func main(){
	a := make([]byte, 10)
	for i := 0; i < 10; i++{
		a[i] = byte(i)
	}
	b := a[2:5]
	fmt.Println("切片b")
	fmt.Printf("a:%d\nb:%d\na len:%d, a cap:%d, b len:%d, b cap:%d\n", a, b, len(a), cap(a), len(b), cap(b))

	c := make([]byte, 2)
	b = append(b, c...)
	fmt.Println("追加c")
	fmt.Printf("a:%d\nb:%d\na len:%d, a cap:%d, b len:%d, b cap:%d\n", a, b, len(a), cap(a), len(b), cap(b))

	d := make([]byte, 5)
	b = append(b, d...)
	fmt.Println("追加d")
	fmt.Printf("a:%d\nb:%d\na len:%d, a cap:%d, b len:%d, b cap:%d\n", a, b, len(a), cap(a), len(b), cap(b))


	e := make([]byte, 7)
	b = append(b, e...)
	fmt.Println("追加e")
	fmt.Printf("a:%d\nb:%d\na len:%d, a cap:%d, b len:%d, b cap:%d\n", a, b, len(a), cap(a), len(b), cap(b))
}

二、输出

切片b
a:[0 1 2 3 4 5 6 7 8 9]
b:[2 3 4]
a len:10, a cap:10, b len:3, b cap:8
追加c
a:[0 1 2 3 4 0 0 7 8 9]
b:[2 3 4 0 0]
a len:10, a cap:10, b len:5, b cap:8
追加d
a:[0 1 2 3 4 0 0 7 8 9]
b:[2 3 4 0 0 0 0 0 0 0]
a len:10, a cap:10, b len:10, b cap:16
追加e
a:[0 1 2 3 4 0 0 7 8 9]
b:[2 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
a len:10, a cap:10, b len:17, b cap:32

三、结论

对 slice 进行切片时,假设原 slice 为 a,对 a 切片 [i:j] 为 b, b 会和原 a 共享底层数组,b的容量 = a容量 - i。此时对 b 进行操作,分以下几种情况

  • 若对 b 追加后的长度小于 b 的容量,会直接修改底层数组, a 也会跟着改变。
  • 若对 b 追加后的长度大于 b 的容量,会新建一个容量为原来容量 n 倍(新容量足以容纳所有元素)的 slice 并追加内容,a 不会被修改。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值