0

0

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

心靈之曲

心靈之曲

发布时间:2025-12-31 14:00:26

|

935人浏览过

|

来源于php中文网

原创

如何避免 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 与输入切片完全隔离。

跃问视频
跃问视频

阶跃星辰推出的AI视频生成工具

下载

⚠️ 注意事项:

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

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

相关专题

更多
golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

196

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

189

2025.07.04

go语言 数组和切片
go语言 数组和切片

本专题整合了go语言数组和切片的区别与含义,阅读专题下面的文章了解更多详细内容。

46

2025.09.03

go语言 数组和切片
go语言 数组和切片

本专题整合了go语言数组和切片的区别与含义,阅读专题下面的文章了解更多详细内容。

46

2025.09.03

append用法
append用法

append是一个常用的命令行工具,用于将一个文件的内容追加到另一个文件的末尾。想了解更多append用法相关内容,可以阅读本专题下面的文章。

343

2023.10.25

python中append的用法
python中append的用法

在Python中,append()是列表对象的一个方法,用于向列表末尾添加一个元素。想了解更多append的更多内容,可以阅读本专题下面的文章。

1073

2023.11.14

python中append的含义
python中append的含义

本专题整合了python中append的相关内容,阅读专题下面的文章了解更多详细内容。

175

2025.09.12

append用法
append用法

append是一个常用的命令行工具,用于将一个文件的内容追加到另一个文件的末尾。想了解更多append用法相关内容,可以阅读本专题下面的文章。

343

2023.10.25

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

23

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.8万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号