Leong's blog Leong's blog
首页
  • 编程
  • 资源
  • Golang
  • 微服务
  • vue
  • 操作系统
  • 数据结构与算法
  • Linux
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Leong Y

跑起来吧
首页
  • 编程
  • 资源
  • Golang
  • 微服务
  • vue
  • 操作系统
  • 数据结构与算法
  • Linux
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • go基础

    • Go的深浅拷贝
      • 并发安全map
    • go常用库

    • web开发

    • Golang
    • go基础
    leong
    2024-06-03
    目录

    Go的深浅拷贝

    # Go的深浅拷贝

    # 浅拷贝(Shallow Copy)

    浅拷贝是指复制对象时只复制对象的引用,而不复制对象本身。对于复杂数据结构(如切片、映射等),浅拷贝只复制它们的顶层结构,而不复制它们内部的元素

    浅拷贝的例子如下:

    package main
    
    import "fmt"
    
    func main() {
        a := []int{1, 2, 3}
        b := a
        b[0] = 100
    
        fmt.Println("a:", a) // 输出: a: [100 2 3]
        fmt.Println("b:", b) // 输出: b: [100 2 3]
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    在这个例子中,b := a 只是复制了切片 a 的引用,因此 b 和 a 指向同一个底层数组。修改 b 中的元素会影响到 a。

    # 深拷贝(Deep Copy)

    深拷贝是指复制对象时不仅复制对象的引用,还复制对象及其所有子对象(如果有)。这样,深拷贝后的对象是一个完全独立的副本,修改副本不会影响到原始对象。

    深拷贝的例子如下(使用copy函数):

    package main
    
    import "fmt"
    
    func main() {
        a := []int{1, 2, 3}
        b := make([]int, len(a))
        copy(b, a)
        b[0] = 100
    
        fmt.Println("a:", a) // 输出: a: [1 2 3]
        fmt.Println("b:", b) // 输出: b: [100 2 3]
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    # 实现深拷贝的通用方法

    对于简单的数据结构,如切片和映射,使用内置的 copy 函数或手动循环复制可以实现深拷贝。但对于复杂的数据结构(如嵌套的切片或映射),需要递归地复制其所有子元素 示例如下:

    package main
    
    import "fmt"
    
    // 深拷贝函数,适用于切片嵌套的情况
    func deepCopy(src [][]int) [][]int {
        dst := make([][]int, len(src))
        for i := range src {
            dst[i] = make([]int, len(src[i]))
            copy(dst[i], src[i])
        }
        return dst
    }
    
    func main() {
        a := [][]int{{1, 2}, {3, 4}}
        b := deepCopy(a)
        b[0][0] = 100
    
        fmt.Println("a:", a) // 输出: a: [[1 2] [3 4]]
        fmt.Println("b:", b) // 输出: b: [[100 2] [3 4]]
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22

    # 总结

    • 浅拷贝:仅复制引用,两个对象共享相同的数据
    • 深拷贝:复制对象及其所有子对象,两个对象完全独立。
    上次更新: 2024/07/08, 18:19:51
    并发安全map

    并发安全map→

    最近更新
    01
    vue3快速上手
    07-31
    02
    程序从加载到运行的过程
    07-08
    03
    进程、线程、协程
    07-08
    更多文章>
    Theme by Vdoing | Copyright © 2023-2024 Leong Y | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式