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

Go切片的赋值

在 Go 语言中,字符切片([]byte)和字符串切片([]string)是不同类型的切片,不能直接赋值(会报类型不匹配错误)。这里可能是表述上的混淆,我们分两种情况讨论:

情况1:假设是「字节切片 []byte 赋值给另一个字节切片 b

如果是同类型的字节切片([]byte)之间的赋值,此时 ab 会共享底层数组,修改 a 的内容或长度可能影响 b,但清空 a 的方式不同,对 b 的影响也不同。

示例代码:
package mainimport "fmt"func main() {a := []byte("hello")b := a // a 和 b 共享底层数组,len 和 cap 相同fmt.Println("初始状态:")fmt.Printf("a: %v(值:%s), len=%d, cap=%d\n", a, a, len(a), cap(a))fmt.Printf("b: %v(值:%s), len=%d, cap=%d\n", b, b, len(b), cap(b))// 清空 a 的方式1:重新赋值为空切片(改变 a 的指向,不影响 b)a = []byte{}fmt.Println("\na 重新赋值为空切片后:")fmt.Printf("a: %v(值:%s), len=%d, cap=%d\n", a, a, len(a), cap(a))fmt.Printf("b: %v(值:%s), len=%d, cap=%d\n", b, b, len(b), cap(b)) // b 不变// 重新给 a 赋值,再用方式2清空a = []byte("world")b = afmt.Println("\n重新赋值 a=world, b=a 后:")fmt.Printf("a: %v(值:%s), len=%d, cap=%d\n", a, a, len(a), cap(a))fmt.Printf("b: %v(值:%s), len=%d, cap=%d\n", b, b, len(b), cap(b))// 清空 a 的方式2:修改长度为0(保留底层数组,a 和 b 仍共享)a = a[:0]fmt.Println("\na 截断为 len=0 后:")fmt.Printf("a: %v(值:%s), len=%d, cap=%d\n", a, a, len(a), cap(a)) // len=0,cap 不变fmt.Printf("b: %v(值:%s), len=%d, cap=%d\n", b, b, len(b), cap(b)) // b 仍保留原长度和值
}
输出结果:
初始状态:
a: [104 101 108 108 111](值:hello), len=5, cap=5
b: [104 101 108 108 111](值:hello), len=5, cap=5a 重新赋值为空切片后:
a: [](值:), len=0, cap=0
b: [104 101 108 108 111](值:hello), len=5, cap=5重新赋值 a=world, b=a 后:
a: [119 111 114 108 100](值:world), len=5, cap=5
b: [119 111 114 108 100](值:world), len=5, cap=5a 截断为 len=0 后:
a: [](值:), len=0, cap=5
b: [119 111 114 108 100](值:world), len=5, cap=5
结论:
  • 清空 a 的方式

    1. a = []byte{}a = make([]byte, 0):重新创建一个空切片,a 指向新的底层数组,与 b 彻底分离。
    2. a = a[:0]:仅将 a 的长度截断为 0,保留原有底层数组(容量不变),ab 仍共享底层数组,但 b 的长度和值不受影响(因为 b 的长度未变)。
  • b 的影响

    • 方式1清空 a 后,b 不受影响(仍指向原底层数组,保留原数据)。
    • 方式2清空 a 后,b 也不受影响(b 的长度和值不变,只是 a 自身长度变为 0)。

情况2:假设是「字节切片 []byte 转换为字符串切片 []string 后赋值」

由于 []byte[]string 类型不同,必须显式转换(通常是将 []byte 转为 string 后再放入 []string)。此时两者底层不共享数据,清空原 []byte[]string 无影响。

示例代码:
package mainimport "fmt"func main() {a := []byte("hello")       // 字节切片b := []string{string(a)}   // 转换为字符串后放入字符串切片fmt.Println("初始状态:")fmt.Printf("a: %s, b: %v\n", a, b) // a: hello, b: [hello]// 清空 a(两种方式)a = []byte{} // 方式1:重新赋值为空// 或 a = a[:0](方式2:截断长度)fmt.Println("清空 a 后:")fmt.Printf("a: %s, b: %v\n", a, b) // a: , b: [hello](b 不受影响)
}
结论:
  • []byte 转换为 []string 时,会通过 string(a) 生成一个新的字符串(拷贝底层数据),因此 ab 完全独立。
  • 无论如何清空 a(重新赋值或截断),b 都不会发生变化,因为 b 中存储的是转换后的字符串副本。

总结

  1. 同类型切片(如 []byte 赋值给 []byte):

    • 清空方式影响 a 自身的指向或长度,b 是否受影响取决于 a 是否与 b 仍共享底层数组(重新赋值为空切片时 b 不变,截断长度时 b 也不变)。
  2. 不同类型切片(如 []byte 转换为 []string):

    • 转换过程会产生数据拷贝,两者完全独立,清空 ab 无任何影响。

核心原因:Go 切片的赋值是“引用传递”(共享底层数组),但不同类型间的转换是“值传递”(拷贝数据),这决定了后续操作的影响范围。

http://www.dtcms.com/a/548878.html

相关文章:

  • Go语言设计模式:原型模式详解
  • 泉州网站建设-泉州网站建设石家庄网站建设招聘
  • [MySQL]表——权限控制
  • 把AI“灌”进奶瓶:1KB决策树让婴儿温奶器自己学会「恒温+计时」
  • 视频网站怎么做移动广告联盟
  • 高速DIC技术用于无人机旋翼动态变形与轨迹姿态分析
  • Node.js环境变量配置
  • Docker 部署 Node.js + Playwright 项目,实现浏览器截图、打印和下载
  • 所有权与解构:一次把“拆”与“留”写进类型系统的旅程 ——从语法糖到零拷贝 AST
  • 基于ASM1042通信接口芯片的两轮车充电机性能优化研究
  • hadoop之MapReduce的map工作流程
  • 民治做网站公司门户网站开发要求
  • 设计师网站欣赏企业官网模板图下载
  • 图像与视频页面的数据提取:从OCR到关键帧抽取的一场“视觉接管”
  • 常州城乡建设学校网站上海自动seo
  • Android15 Camera系统调试操作
  • 建模工具Enterprise Architect:敏捷开发中的架构治理与迭代适配
  • [HDiffPatch] 补丁算法 | `patch_decompress_with_cache` | `getStreamClip` | RLE游程编码
  • 【C++ vector 深度解析】:动态数组的使用与底层原理实战
  • 【0基础学算法】前缀和刷题日志(三):连续数组、矩阵区域和
  • 学习网站建设与管理汉沽集团网站建设
  • 10月30日
  • ESP32开发指南(基于IDF):连接AWS,乐鑫官方esp-aws-iot-master例程实验、跑通
  • Cocos资源加密方案解析
  • 从零开始的云原生之旅(六):DaemonSet 实战日志采集器
  • 网站建设人员任职要求电器类网站设计
  • [论文阅读] AI + Debug | 基于大语言模型的GitHub故障复现测试用例生成方法解析
  • 关于App的gradle降级问题的总结
  • 从零开始的云原生之旅(四):K8s 工作负载完全指南
  • 论文阅读笔记——自注意力机制