【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
底层数组 共享 独立
修改影响 互相影响 互不影响
内存消耗
适用场景 不需要独立修改或关注性能的场景 需要独立修改或确保数据安全的场景
相关推荐
追逐时光者19 小时前
一款开源、现代化的 WinForm UI 控件库
后端·.net
暮乘白帝过重山19 小时前
ArkTS ForEach 参数解析:组件与键值生成器
开发语言·数据库
LiamTuc19 小时前
Java构造函数
java·开发语言
三途河畔人19 小时前
Pytho基础语法_运算符
开发语言·python·入门
Benmao⁢19 小时前
C语言期末复习笔记
c语言·开发语言·笔记·leetcode·面试·蓝桥杯
adsadswee19 小时前
Qt 样式与 QLinearGradient 渐变详解
开发语言·qt·qt样式表·qlineargradient·qss渐变效果
花月C20 小时前
个性化推荐:基于用户的协同过滤算法
开发语言·后端·算法·近邻算法
脾气有点小暴20 小时前
前端页面跳转的核心区别与实战指南
开发语言·前端·javascript
rit843249920 小时前
基于MATLAB的BP神经网络手写数字识别
开发语言·神经网络·matlab
cci20 小时前
还在用conda?,试试uv,提高包的安装速度
后端