切换语言为:繁体

Go语言中slice的深拷贝和浅拷贝

  • 爱糖宝
  • 2024-10-24
  • 2061
  • 0
  • 0

基本概念

在 Go 语言中,slice深拷贝浅拷贝主要涉及到 slice 底层数组的复制方式。理解它们的区别对于正确处理数据和避免意外的副作用非常重要。

浅拷贝(Shallow Copy)

浅拷贝是指只复制 slice 的结构(即长度、容量和指向底层数组的指针),而不复制底层数组本身。这意味着两个 slice 共享同一个底层数组。

示例代码

package main

import (
    "fmt"
)

func main() {
    original := []int{1, 2, 3, 4, 5}
    shallowCopy := original

    fmt.Println("Original:", original)
    fmt.Println("Shallow Copy:", shallowCopy)

    // 修改浅拷贝的第一个元素
    shallowCopy[0] = 100

    fmt.Println("After modification:")
    fmt.Println("Original:", original)
    fmt.Println("Shallow Copy:", shallowCopy)
}

输出

Original: [1 2 3 4 5]
Shallow Copy: [1 2 3 4 5]
After modification:
Original: [100 2 3 4 5]
Shallow Copy: [100 2 3 4 5]

在这个例子中,shallowCopy 只是 original 的一个浅拷贝。修改 shallowCopy 的元素会影响到 original,因为它们共享同一个底层数组。

深拷贝(Deep Copy)

深拷贝是指不仅复制 slice 的结构,还复制底层数组的内容。这意味着两个 slice 拥有独立的底层数组,修改其中一个 slice 不会影响另一个。

示例代码

package main

import (
    "fmt"
)

func main() {
    original := []int{1, 2, 3, 4, 5}
    deepCopy := make([]int, len(original))
    copy(deepCopy, original)

    fmt.Println("Original:", original)
    fmt.Println("Deep Copy:", deepCopy)

    // 修改深拷贝的第一个元素
    deepCopy[0] = 100

    fmt.Println("After modification:")
    fmt.Println("Original:", original)
    fmt.Println("Deep Copy:", deepCopy)
}

输出

Original: [1 2 3 4 5]
Deep Copy: [1 2 3 4 5]
After modification:
Original: [1 2 3 4 5]
Deep Copy: [100 2 3 4 5]

在这个例子中,deepCopy 是通过 copy 函数创建的,它复制了 original 的底层数组内容。修改 deepCopy 的元素不会影响到 original,因为它们拥有独立的底层数组。

总结

  • 浅拷贝:只复制 slice 的结构,不复制底层数组内容,两个 slice 共享同一个底层数组。

  • 深拷贝:不仅复制 slice 的结构,还复制底层数组内容,两个 slice 拥有独立的底层数组。

0条评论

您的电子邮件等信息不会被公开,以下所有项均必填

OK! You can skip this field.