如何避免 Go 中字节切片在函数调用中被意外修改
发布时间 - 2025-12-31 00:00:00 点击率:次go 中切片是引用类型,直接赋值(如 `cry
ptkey := 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
# 是一个
# 这是
# 也会
# 当你
# 它会
# 本质上
# 复用
# 若需
# alphabet
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
如何在阿里云虚拟服务器快速搭建网站?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
Laravel如何使用Service Container和依赖注入?(代码示例)
微信h5制作网站有哪些,免费微信H5页面制作工具?
C语言设计一个闪闪的圣诞树
进行网站优化必须要坚持的四大原则
JavaScript如何实现音频处理_Web Audio API如何工作?
Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践
微信小程序 HTTPS报错整理常见问题及解决方案
使用豆包 AI 辅助进行简单网页 HTML 结构设计
php json中文编码为null的解决办法
Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用
如何基于PHP生成高效IDC网络公司建站源码?
Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
清除minerd进程的简单方法
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法
Laravel集合Collection怎么用_Laravel集合常用函数详解
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧
php 三元运算符实例详细介绍
android nfc常用标签读取总结
深圳网站制作平台,深圳市做网站好的公司有哪些?
深圳网站制作培训,深圳哪些招聘网站比较好?
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
实例解析Array和String方法
西安专业网站制作公司有哪些,陕西省建行官方网站?
Claude怎样写约束型提示词_Claude约束提示词写法【教程】
html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
JavaScript如何操作视频_媒体API怎么控制播放
JS经典正则表达式笔试题汇总
Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件
百度浏览器如何管理插件 百度浏览器插件管理方法
如何选择PHP开源工具快速搭建网站?
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层
Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优
Laravel如何发送系统通知?(Notification渠道示例)
在centOS 7安装mysql 5.7的详细教程
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
详解Huffman编码算法之Java实现

