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