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

浅拷贝(Shallow Copy)

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

实现方式

  1. 直接赋值

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

    go 复制代码
    slice1 := []int{1, 2, 3}
    slice2 := slice1[:]  // 浅拷贝

特点

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

示例

go 复制代码
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]
}

深拷贝(Deep Copy)

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

实现方式

  1. 使用copy函数

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

    go 复制代码
    slice1 := []int{1, 2, 3}
    slice2 := append([]int{}, slice1...)  // 深拷贝

特点

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

示例

go 复制代码
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
底层数组 共享 独立
修改影响 互相影响 互不影响
内存消耗
适用场景 不需要独立修改或关注性能的场景 需要独立修改或确保数据安全的场景
相关推荐
DICOM医学影像2 分钟前
2. go语言从零实现以太坊客户端-查询区块链账户余额
开发语言·golang·区块链·以太坊·web3.0·hardhat
Data_agent13 分钟前
Python 编程实战:函数与模块化编程及内置模块探索
开发语言·python
new_zhou13 分钟前
vs2019+qt工程中生成dump文件及调试
开发语言·qt·visual studio·dump调试
栈与堆38 分钟前
LeetCode 19 - 删除链表的倒数第N个节点
java·开发语言·数据结构·python·算法·leetcode·链表
一路向北·重庆分伦40 分钟前
03-01:MQ常见问题梳理
java·开发语言
一 乐41 分钟前
绿色农产品销售|基于springboot + vue绿色农产品销售系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·后端·宠物
txinyu的博客44 分钟前
结合游戏场景理解,互斥锁,读写锁,自旋锁,CAS / 原子变量,分段锁
开发语言·c++·游戏
3***68841 小时前
Spring Boot中使用Server-Sent Events (SSE) 实现实时数据推送教程
java·spring boot·后端
阿里嘎多学长1 小时前
2026-01-11 GitHub 热点项目精选
开发语言·程序员·github·代码托管
yuanyikangkang1 小时前
STM32 lin控制盒
开发语言