go slice深拷贝和浅拷贝
切片slice的数据结构
type SliceHeader struct {
Data uintptr //指向的底层数组地址
Len int //切片长度
Cap int //切片容量
}
浅拷贝
目的切片和源切片指向同一个底层数组,任何一个数组元素改变,都会同时影响两个数组。
package main
import (
"fmt"
"reflect"
"unsafe"
)
func main() {
slice1 := []int{1,2,3,4,5}
slice2 := slice1
fmt.Println(slice1)
fmt.Println(slice2)
//同时改变两个数组
slice1[1]=100
fmt.Println(slice1)
fmt.Println(slice2)
fmt.Println("切片1指向的底层数组地址:",(*reflect.SliceHeader)(unsafe.Pointer(&slice1)))
fmt.Println("切片2指向的底层数组地址:",(*reflect.SliceHeader)(unsafe.Pointer(&slice2)))
}
结果:
[1 2 3 4 5]
[1 2 3 4 5]
[1 100 3 4 5]
[1 100 3 4 5]
切片1指向的底层数组地址: &{824634425392 5 5}
切片2指向的底层数组地址: &{824634425392 5 5}
深拷贝
目的切片和源切片指向不同的底层数组,任何一个数组元素改变都不影响另外一个。
package main
import (
"fmt"
"reflect"
"unsafe"
)
func main() {
slice1 := []int{1,2,3,4,5}
slice2 := make([]int,5,5)
copy(slice2,slice1)
fmt.Println(slice1)
fmt.Println(slice2)
slice1[1]=100 //只会影响slice1
fmt.Println(slice1)
fmt.Println(slice2)
fmt.Println("切片1指向的底层数组地址:",(*reflect.SliceHeader)(unsafe.Pointer(&slice1)))
fmt.Println("切片2指向的底层数组地址:",(*reflect.SliceHeader)(unsafe.Pointer(&slice2)))
}
结果:
[1 2 3 4 5]
[1 2 3 4 5]
[1 100 3 4 5]
[1 2 3 4 5]
切片1指向的底层数组地址: &{824633803040 5 5}
切片2指向的底层数组地址: &{824633803088 5 5}
本作品采用《CC 协议》,转载必须注明作者和本文链接