知识卡片

切片共享底层数组的别名陷阱

专业/工作 · 483.a.1

内容

对一个切片再切片(如t := s[:5]u := s[3:6])并不会复制数据,新旧切片仍然指向同一块底层数组,只是各自记录了不同的起止范围。发散:这个”别名”特性既是切片高效(切片操作不拷贝数据)的来源,也是最容易踩坑的地方——把一个切片传给函数、又在函数外继续用原切片,很容易在不经意间产生两个”看起来独立、实际共享数据”的切片,想要真正的独立副本必须显式调用copy()

参考来源

- 位置:《Go语言程序设计》第4章《集合类型》(源文件:_epub-src/OEBPS/text00039.html) - 结论依据:原文在该章节围绕“对一个切片再切片(如`t:=s[:5]`、`u:=s[3:6]`)并不会复制数据,新旧切片仍然指向同一块底层数…”给出定义、示例或限制条件;摘录中的术语、代码片段或对比关系直接支撑本卡片的结论。 - 原始内容:类型的零值 complex ( r , i ) 一个 complex128 复数,其实部 r 和虚部 i 给定,并且都为 float64 (参见2.3.2节) copy ( dst , src ) copy ( b , s ) 将 src 切片中的项复制(可能是重叠)到 dst 切片中,如果空间不够则截断;或者将字符串字节 s 复制到 […