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 协议》,转载必须注明作者和本文链接
拉姆塞
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!