go疑点 切片的内存地址

在学习golang的时候发现关于切片添加删除的时候如果不使用copy可能会带来这些问题,我分别对增删改进行了测试,测试如下

package main

import (
	"fmt"
)

func test1() {
	fmt.Println("----------添加元素---------")
	s1 := []int{1, 2, 3}
	s2 := s1
	fmt.Printf("s1: %p,s2: %p\n", s1, s2)
	s1 = append(s1, 100)
	fmt.Printf("s1: %v,s2: %v\n", s1, s2)
	fmt.Printf("s1: %p,s2: %p\n", s1, s2)
}

func test2() {
	fmt.Println("----------修改元素---------")
	s1 := []int{1, 2, 3}
	s2 := s1
	fmt.Printf("s1: %p,s2: %p\n", s1, s2)
	s1[0] = 100
	fmt.Printf("s1: %v,s2: %v\n", s1, s2)
	fmt.Printf("s1: %p,s2: %p\n", s1, s2)
}

func test3() {
	fmt.Println("----------删除元素---------")
	s1 := []int{1, 2, 3, 4, 5, 6}
	s2 := s1
	fmt.Printf("s1: %p,s2: %p\n", s1, s2)
	fmt.Printf("s1: %T,s2: %T\n", s1, s2)
	s1 = append(s1[:2], s1[3:]...)
	fmt.Printf("s1: %v,s2: %v\n", s1, s2)
	fmt.Printf("s1: %p,s2: %p\n", s1, s2)
	fmt.Printf("s1: %T,s2: %T\n", s1, s2)
}

func test4() {
	fmt.Println("----------copy元素---------")
	s1 := []int{1, 2, 3, 4, 5, 6}
	s2 := make([]int, 6) //注意需要分配内存,不能直接s2 := []int{}
	copy(s2, s1)
	fmt.Printf("s1: %p,s2: %p\n", s1, s2)
	fmt.Printf("s1: %T,s2: %T\n", s1, s2)
	s1 = append(s1[:2], s1[3:]...)
	fmt.Printf("s1: %v,s2: %v\n", s1, s2)
	fmt.Printf("s1: %p,s2: %p\n", s1, s2)
	fmt.Printf("s1: %T,s2: %T\n", s1, s2)
}
func main() {
	test1()
	test2()
	test3()
	// test4()
}

删除结果如下

----------添加元素---------
s1: 0x1400001e0d8,s2: 0x1400001e0d8
s1: [1 2 3 100],s2: [1 2 3]
s1: 0x14000014240,s2: 0x1400001e0d8
----------修改元素---------
s1: 0x1400001e0f0,s2: 0x1400001e0f0
s1: [100 2 3],s2: [100 2 3]
s1: 0x1400001e0f0,s2: 0x1400001e0f0
----------删除元素---------
s1: 0x14000014270,s2: 0x14000014270
s1: []int,s2: []int
s1: [1 2 4 5 6],s2: [1 2 4 5 6 6]
s1: 0x14000014270,s2: 0x14000014270
s1: []int,s2: []int

可能有人已经发现了,在添加和删除元素的时候,之前的内存地址是一致的,也就是说如果按照预期的话,那么照我看来无论修改其中的哪个切片,另外一个也应该发生变化,但是在增删之后发现结果显然是不符合预期的,但是如果修改其中的元素却符合预期。
通过上述,推测应该是内存中定义了大小后无法对其长度发生修改变化,后续在补充该问题具体原因。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值