欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 培训 > 【go】slice的浅拷贝和深拷贝

【go】slice的浅拷贝和深拷贝

2025/5/16 14:19:57 来源:https://blog.csdn.net/m0_74282926/article/details/147044391  浏览:    关键词:【go】slice的浅拷贝和深拷贝

浅拷贝(Shallow Copy)

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

实现方式

  1. 直接赋值

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

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

特点

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

示例

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

深拷贝(Deep Copy)

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

实现方式

  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 mainimport "fmt"func main() {original := []int{1, 2, 3}copy := make([]int, len(original))copy(copy, original)  // 深拷贝copy[0] = 100fmt.Println(original)  // [1 2 3]fmt.Println(copy)      // [100 2 3]
}

注意事项

  1. copy函数的行为

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

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

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

总结

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词