全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

如何使用Golang数组与切片复制_深拷贝与浅拷贝示例

Go中数组赋值是值拷贝(类似深拷贝),切片赋值是头信息拷贝(浅拷贝),底层数组共享;深拷贝切片需make+copy或append(nil, s...);嵌套指针或切片需递归处理。

Go语言中没有直接的“深拷贝”或“浅拷贝”关键字,但数组和切片的行为差异天然体现了这两种语义。理解底层机制比套用术语更重要:数组赋值是值拷贝(类似深拷贝),切片赋值是头信息拷贝(即浅拷贝),而底层数组仍共享。

数组复制 = 值拷贝(自动深拷贝效果)

Go中数组是值类型。声明时长度固定,赋值或传参时整个数组内容被复制,新旧变量完全独立。

示例:

arr1 := [3]int{1, 2, 3}
arr2 := arr1 // 完整复制一份
arr2[0] = 999
fmt.Println(arr1) // [1 2 3]
fmt.Println(arr2) // [999 2 3]

✅ 关键点:修改 arr2 不影响 arr1,因为内存中存在两份独立数据。

切片复制 = 头部结构拷贝(典型浅拷贝)

切片是引用类型(包含指针、长度、容量三部分)。直接赋值只复制这三个字段,底层数组地址相同,因此修改元素会影响原切片。

示例:

s1 := []int{1, 2, 3}
s2 := s1 // 只拷贝头:指向同一底层数组
s2[0] = 999
fmt.Println(s1) // [999 2 3]
fmt.Println(s2) // [999 2 3]

⚠️ 注意:即使 s2 后续 append 扩容导致底层数组迁移,s1 也不受影响;但只要未扩容,它们就共享存储。

手动实现切片的深拷贝

若需完全独立副本,必须分配新底层数组并逐元素复制。标准做法是使用 copy()append([]T(nil), s...)

  • 方法1:copy() + make()
s1 := []int{1, 2, 3}
s2 := make([]int, len(s1))
copy(s2, s1) // 从 s1 拷贝 len(s1) 个元素到 s2
s2[0] = 999
fmt.Println(s1) // [1 2 3]
fmt.Println(s2) // [999 2 3]
  • 方法2:append + nil 切片(简洁惯用)
s1 := []int{1, 2, 3}
s2 := append([]int(nil), s1...) // 创建新底层数组并填充
s2[0] = 999
fmt.Println(s1) // [1 2 3]
fmt.Println(s2) // [999 2 3]

✅ 两种方式都确保 s1 和 s2 底层无共享,适合需要隔离修改的场景(如并发写入、函数返回副本等)。

嵌套结构的深拷贝需额外处理

如果切片元素是指针、map、struct(含指针字段)或另一切片,则上述 copy/append 只复制顶层元素——即“浅层深拷贝”。要真正深拷贝,需递归克隆每个可变内部值。

例如:

type Person struct {
    Name *string
    Tags []string
}
p1 := Person{
    Name: new(string),
    Tags: []string{"a", "b"},
}
*p1.Name = "Alice"

p2 := p1 // 结构体是值类型,但 Name 是指针,Tags 是切片头
*p2.Name = "Bob"     // 影响 p1.Name!
p2.Tags[0] = "x"     // 也影响 p1.Tags!

? 此时需手动构造新 Person,并 new() 新指针、make+copy 新切片。复杂场景建议用第三方库如 github.com/jinzhu/copiergob 编码再解码(注意性能开销)。


# git  # go  # github  # golang  # go语言  # 编码  # app  # 递归  # 指针  # 值类型  # 引用类型  # Struct 


相关文章: 微信小程序制作网站有哪些,微信小程序需要做网站吗?  建站之星代理商如何保障技术支持与售后服务?  临沂网站制作企业,临沂第三中学官方网站?  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  如何通过FTP空间快速搭建安全高效网站?  潮流网站制作头像软件下载,适合母子的网名有哪些?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  如何通过wdcp面板快速创建网站?  小型网站制作HTML,*游戏网站怎么搭建?  建站主机类型有哪些?如何正确选型  想学网站制作怎么学,建立一个网站要花费多少?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?  官网自助建站平台指南:在线制作、快速建站与模板选择全解析  建站之星展会模版如何一键下载生成?  如何通过虚拟机搭建网站?详细步骤解析  北京建设网站制作公司,北京古代建筑博物馆预约官网?  婚礼视频制作网站,学习*后期制作的网站有哪些?  制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?  广平建站公司哪家专业可靠?如何选择?  如何使用Golang table-driven基准测试_多组数据测量函数效率  网站制作知乎推荐,想做自己的网站用什么工具比较好?  公司网站制作价格怎么算,公司办个官网需要多少钱?  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  高端云建站费用究竟需要多少预算?  Swift中swift中的switch 语句  如何挑选优质建站一级代理提升网站排名?  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  全景视频制作网站有哪些,全景图怎么做成网页?  网站制作的方法有哪些,如何将自己制作的网站发布到网上?  如何设计高效校园网站?  建站之星北京办公室:智能建站系统与小程序生成方案解析  Android滚轮选择时间控件使用详解  ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?  建站主机选哪家性价比最高?  建站主机如何选?高性价比方案全解析  如何通过西部建站助手安装IIS服务器?  如何在腾讯云免费申请建站?  已有域名和空间如何快速搭建网站?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  为什么Go需要go mod文件_Go go mod文件作用说明  如何用VPS主机快速搭建个人网站?  创业网站制作流程,创业网站可靠吗?  百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?  无锡营销型网站制作公司,无锡网选车牌流程?  如何快速使用云服务器搭建个人网站?  建站之星收费标准详解:套餐费用及年费价格表一览  免费网站制作appp,免费制作app哪个平台好?  C++如何使用std::optional?(处理可选值) 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。