当前位置: 首页 > news >正文

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

浅拷贝(Shallow 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]
}

深拷贝(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 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
底层数组共享独立
修改影响互相影响互不影响
内存消耗
适用场景不需要独立修改或关注性能的场景需要独立修改或确保数据安全的场景

相关文章:

  • Python设计模式:适配模式
  • 2025 年江苏保安员职业资格考试经验分享​
  • starrocks split函数和trino split函数差异性
  • 【正点原子】如何设置 ATK-DLMP135 开发板 eth0 的开机默认 IP 地址
  • Windows RAC 集群故障:表决盘 “失踪” 致无法启动的排查实践
  • Docker部署Jenkins服务
  • ComfyUI模型下载与路径问题解决
  • IAGCN:登上《Nature》的深度学习可解释性情感分析模型突破
  • Appium的学习总结-Inspector参数设置和界面使用(5)
  • 【图像处理基石】什么是ISP色彩管理?
  • Android OpenCV 人脸识别 识别人脸框 识别人脸控件自定义
  • python小整数池和字符串贮存
  • Threejs实现天空盒效果
  • 前端单页应用性能优化全指南:从加载提速到极致体验
  • 《AI大模型趣味实战》智能财务助手系统配套说明:数据报表与指标手册
  • flink cdc的source数据流如何配置事件时间,如何设置时间语义,分配时间戳并生成水位线
  • JavaScript-异步和同步函数使用场景及区别-正确构建程序的核心要点
  • 3️⃣ Coze工作流基础教学(2025年全新版本)
  • 学习MySQL第七天
  • 使用Pholcus编写Go爬虫示例
  • 通化 网站建设/交换友链
  • 汽配公司的网站要怎么做/找资源的关键词有哪些
  • 故事网站模版/chrome官网
  • 大丰网站建设价格/2345网址导航官网官方电脑版下载
  • 如何刷网站流量/色盲测试图
  • 如何经营自己的网站/漯河网站推广公司