全网整合营销服务商

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

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

如何避免 Go 中字节切片在函数调用中被意外修改

go 中切片是引用类型,直接赋值(如 `cryptkey := alphabet`)仅复制头信息,底层数组共享;若函数内原地修改切片内容,原始切片也会被改变。解决方法是创建独立副本,例如使用 `append([]byte(nil), b...)`。

在 Go 语言中,切片([]byte)本质上是一个包含指向底层数组的指针、长度(len)和容量(cap)的结构体。当你执行 cryptkey := alphabet 时,并未复制底层数据,只是复制了这个结构体——因此 alphabet 和 cryptkey 指向同一块内存区域。后续对 cryptkey 的任何原地修改(如交换元素),都会同步反映在 alphabet 上。

上述问题中的 shuffle 函数正是如此:它接收切片 b,将 out := b 赋值给新变量,但 out 与 b(进而与 alphabet)仍共用底层数组。因此洗牌操作直接修改了原始字母表。

✅ 正确做法:在 shuffle 内部创建深拷贝(即独立底层数组):

func shuffle(b []byte) []byte {
    l := len(b)
    // 创建新底层数组:安全、高效、惯用
    out := append([]byte(nil), b...)
    for i := range out {
        dest := rand.Intn(l)
        out[i], out[dest] = out[dest], out[i]
    }
    return out
}

append([]byte(nil), b...) 是 Go 官方推荐的零分配开销切片拷贝方式:它会分配一块新内存并逐字节复制 b 的内容,确保 out 与输入切片完全隔离。

⚠️ 注意事项:

  • 不要使用 make([]byte, len(b)); copy(dst, b) —— 虽然等效,但 append(...) 更简洁;
  • 避免 out := b[:] 或 out := b,它们不产生新底层数组;
  • 若需可复用的通用拷贝函数,可封装为:
    func cloneBytes(src []byte) []byte {
        return append([]byte(nil), src...)
    }

总结:Go 切片的“引用语义”是强大特性的双刃剑。当需要函数保持输入不可变时,务必显式创建副本——这是编写健壮、可预测 Go 代码的基本守则。


# go  # app  # 字节  # 解决方法  # 封装  # 结构体  # 指针  # 引用类型  # 切片  # len  # cap  # nil  # append  # copy  # 是一个  # 这是  # 也会  # 当你  # 它会  # 本质上  # 复用  # 若需  # pre 


相关文章: 如何彻底卸载建站之星软件?  武清网站制作公司,天津武清个人营业执照注销查询系统网站?  黑客入侵网站服务器的常见手法有哪些?  如何选择建站程序?包含哪些必备功能与类型?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  香港服务器WordPress建站指南:SEO优化与高效部署策略  相册网站制作软件,图片上的网址怎么复制?  如何快速生成橙子建站落地页链接?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】  魔毅自助建站系统:模板定制与SEO优化一键生成指南  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  建站之星2.7模板:企业网站建设与h5定制设计专题  家具网站制作软件,家具厂怎么跑业务?  建站之星如何快速更换网站模板?  如何通过WDCP绑定主域名及创建子域名站点?  制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?  东莞专业制作网站的公司,东莞大学生网的网址是什么?  PHP正则匹配日期和时间(时间戳转换)的实例代码  建站之星后台密码遗忘?如何快速找回?  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  西安专业网站制作公司有哪些,陕西省建行官方网站?  免费网站制作appp,免费制作app哪个平台好?  安云自助建站系统如何快速提升SEO排名?  如何零成本快速生成个人自助网站?  如何在腾讯云免费申请建站?  如何在IIS中配置站点IP、端口及主机头?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  个人摄影网站制作流程,摄影爱好者都去什么网站?  C++时间戳转换成日期时间的步骤和示例代码  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  宝华建站服务条款解析:五站合一功能与SEO优化设置指南  如何用花生壳三步快速搭建专属网站?  建站之星CMS五站合一模板配置与SEO优化指南  如何快速启动建站代理加盟业务?  建设网站制作价格,怎样建立自己的公司网站?  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  太平洋网站制作公司,网络用语太平洋是什么意思?  javascript中对象的定义、使用以及对象和原型链操作小结  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  内网网站制作软件,内网的网站如何发布到外网?  c++怎么用jemalloc c++替换默认内存分配器【性能】  建站之星微信建站一键生成小程序+多端营销系统  佛山网站制作系统,佛山企业变更地址网上办理步骤?  如何快速搭建高效香港服务器网站?  智能起名网站制作软件有哪些,制作logo的软件?  建站之星2.7模板快速切换与批量管理功能操作指南  已有域名和空间如何搭建网站? 

您的项目需求

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