golang slice知识点

golang的slice底层依靠数组实现,它包括三个部分:指向数组的指针、切片的长度和切片的容量,本质就是一个指向固定大小数组的指针,当大小超过数组时就创建新的,更大的数组,然后指向新数组。

slice的长度len,容量(也就是底层的数组大小)cap,当len的大小大于cap时就触发自动扩容,并将原来的元素拷贝到新的数组中。自动扩容的设计理念是扩容至原先的两倍,实际扩容大小则有所不同,参照slice扩容大小

当切片作为函数或方法的参数传递时,实际上传递的是切片的指针。也就是说在函数体内可以直接操作传入切片的内容。(slice是引用类型)

package main

import "fmt"

func main() {
	diySlice := make([]int, 0, 2)
	diySlice = append(diySlice, 8)

	//观察diySlice3
	diySlice3 := append(diySlice, 1)
	//diySlice 变化
	//查看输出切片的变化,为什么和直接输出结果不一样
	fmt.Println("diySlice内容下标", diySlice[0:2])
	//查看输出切片的变化
	fmt.Println("diySlice 内容", diySlice)
	//查看长度和容量
	fmt.Printf("diySlice-->容量%d 长度%d\n", cap(diySlice), len(diySlice))

	fmt.Println("diySlice3 内容", diySlice3)
	fmt.Printf("diySlice3-->容量%d 长度%d\n", cap(diySlice3), len(diySlice3))

	//观察diySlice2
	diySlice2 := append(diySlice, 1, 2)
	fmt.Println("diySlice2 内容", diySlice2)
	fmt.Printf("diySlice2-->容量%d 长度%d\n", cap(diySlice2), len(diySlice2))
}

diySlice 的容量为2,长度0

添加第一个元素8,此时len变成1

diySlice3 在diySlice 的基础上添加了8,len为2,内容为1,8

diySlice2 在diySlice基础上添加两个元素,1,2,此时len为3,超出了cap的值2,所以扩容,创建新数组,diySlice2 指向新数组,len为3,cap为2 * 2 = 4, 元素8,1,2

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值