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

作者:

文章目录
  • 浅拷贝是指只复制切片本身的结构(指针、长度和容量),而不复制底层数组的元素。
  • 深拷贝是指创建一个新的切片,并且复制底层数组的所有元素。
  • copy函数的行为: 如果目标切片长度小于源切片,只会复制目标切片长度的元素 如果目标切片长度大于源切片,多余的元素保持不变 多维切片的拷贝: 对于多维切片,copy函数或append只能实现第一层的深拷贝 内层切片仍然是浅拷贝,需要递归处理才能实现完全深拷贝 性能考虑: 浅拷贝更快且内存效率更高 深拷贝更安全但消耗更多资源
  • 特性 浅拷贝 深拷贝 实现方式 直接赋值或切片操作 copy函数或append 底层数组 共享 独立 修改影响 互相影响 互不影响 内存消耗 低 高 适用场景 不需要独立修改或关注性能的场景 需要独立修改或确保数据安全的场景 到此这篇关于go中slice浅拷贝和深拷贝的实现的文章就介绍到这了,更多相关go slice浅拷贝和深拷贝内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: Golang 拷贝Array或Slice的操作
  • 目录
    • 浅拷贝(Shallow Copy)
      • 实现方式
      • 特点
      • 示例
    • 深拷贝(Deep Copy)
      • 实现方式
      • 特点
      • 示例
    • 注意事项
      • 总结

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

        1. 直接赋值

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

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

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

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

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

        1. 使用copy函数

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

          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浅拷贝和深拷贝内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

        您可能感兴趣的文章:

        • Golang 拷贝Array或Slice的操作

        站内搜索