go的切片类型使用append追加元素时的原理

package main

import "fmt"

func main() {
	var s1 = []int{1, 2, 3, 4, 5}
	var s2 = s1[:]
	fmt.Printf("s1的地址为%p\n", &s1)
	fmt.Printf("s2的地址为%p\n", &s2)
	s2 = append(s2, 6)
	fmt.Printf("字面量的地址为%p\n", s1)
	fmt.Printf("字面量的地址为%p\n", s2)
	s2[2] += 100
	fmt.Println(s1)
	fmt.Println(s2)
}
//当使用s1为s2赋值时,二者本身的存储地址位于一个区但是不同,而指向
//同一个字面量,当使用s2改变字面量的一部分时,用s1访问,发现也被改变了
//此时s1的len=5,cap=5,当使用append在s2后面追加一个6,
//编译器不会在以前那个字面量后面增加一个6,而是会重新开辟一个普通数组,赋值之前的数组,
//并增加一个6

go的切片类型,底层是普通数组,而一个切片类型数据包括一个指针,指向字面量,字面量则是切片所包含的内容,还包括len,和cap。当使用同一个切片(图中为s1)为另一个切片赋值时(完全复制或子切片),二者会指向同一个字面量,验证如下

package main

import "fmt"

func main() {
	var s1 = []int{1, 2, 3, 4, 5}
	var s2 = s1[0:3]
	fmt.Printf("s1的地址为%p\n", &s1)
	fmt.Printf("s2的地址为%p\n", &s2)
	fmt.Printf("字面量的地址为%p\n", s1)
	fmt.Printf("字面量的地址为%p\n", s2)
	fmt.Println(s1)
	fmt.Println(s2)
}

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值