开发者

go中slice浅拷贝和深拷贝的实现

目录
  • 浅拷贝(Shallow Copy)
    • 实现方式
    • 特点
    • 示例
  • 深拷贝(Deep Copy)
    • 实现方式
    • 特点
    • 示例
  • 注意事项
    • 总结

      浅拷贝(Shallow Copy)

      浅拷贝是指只复制切片本身的结构(指针、长度和容量),而不复制底层数组的元素。

      实现方式

      1. 直接赋值

        slice1 := []int{1, 2, 3}
        slice2 := slice1  // 浅拷贝
        
      2. 切片操作

        slice1 := []int{1, 2, 3}
        slice2 :www.devze.com= slice1[:]  // 浅拷贝
        

      特点

      • 新切片和原切片共享同一个底层数组
      • 修改一个切片的元素会影响另一个切片
      • 内存效率高,因为不需要复制底层数据

      示例

      package main
      
      import "fmt"
      
      func main() {
          original := []int{1, 2, 3}
          copy := original  // 浅拷贝
          
          copy[0] = 100
          
      php    fmt.Println(original)  // [100 2 3]
          fmt.Println(copy)      php// [100 2 3]
      }
      

      深拷贝(Deep Copy)

      深拷贝是指创建一个新的切片,并且复制底层数组的所有元素。

      实现方式

      1. 使用copy函数

        slice1 := []int{1, 2, 3}
        slice2 := make([]int, len(slice1))
        copy(slice2, slice1)  // 深拷贝
        
      2. 使用append(需要先创建一个空OfGBhUXOh切片):

        slice1 := []int{1, 2, 3}
        slice2 := append([]int{}, slice1...)  // 深编程拷贝
        

      特点

      • 新切片有自己的底层数组
      • 修改一个切片的元素不会影响另一个切片
      • 内存消耗更大,因为需要复制所有数据

      示例

      package main
      
      import "fmt"
      
      func main() {
          original := []int{1, 2, 3}
          copy := make([]int, len(original))
          copy(copy, original)  // 深拷贝
          
          copy[0] = 100
          
          fmt.Println(original)  // [1 2 3]
          fmt.Println(copy)      // [100 2 3]
      }
      

      注意事项

      1. copy函数的行为

        • 如果目标切片长度小于源切片,只会复制目标切片长度的元素
        • 如果目标切片长度大于源切片,多余的元素保持不变
      2. 多维切片的拷贝

        • 对于多维切片,copy函数或append只能实现第一层的深拷贝
        • 内层切片仍然是浅拷贝,需要递归处理才能实现完全深拷贝
      3. 性能考虑

        • 浅拷贝更快且内存效率更高
        • 深拷贝更安全但消耗更多资源

      总结

      特性浅拷贝深拷贝
      实现方式直接赋值或切片操作copy函数或append
      底层数组共享独立
      修改影响互相影响互不影响
      内存消耗
      适用场景不需要独立修改或关注性能的场景需要独立修改或确保数据安全的场景

      到此这篇关于go中slice浅拷贝和深拷贝的实现的文章就介绍到这了,更多相关go slice浅拷贝和深拷贝内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜