为了账号安全,请及时绑定邮箱和手机立即绑定

为什么字节数组的 Golang 对象属性在分配给另一个变量时会被擦除

为什么字节数组的 Golang 对象属性在分配给另一个变量时会被擦除

Go
蝴蝶刀刀 2021-10-25 20:29:16
使用后我们需要清除一些变量。但是当它[]byte在结构中分配一个字段时,它看起来真的很奇怪。为什么这个赋值[]byte不是副本而是指针?我应该怎么做才能将值保留在 struct 中a.bs,但清除bas 局部变量? http://play.golang.org/p/MT_wAHj2OMpackage mainimport "fmt"type so struct {    bs []byte}func zeroes(n int) []byte {    return make([]byte, n)}func wipeBytes(b []byte) {    copy(b, zeroes(len(b)))}func main() {    a := so{bs: []byte{0x01, 0x02}}    b := a.bs    wipeBytes(b)    fmt.Println(b)    //b == []byte{}    fmt.Println(a.bs) //a.bs == []byte{}}
查看完整描述

3 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

在声明/创建“数组” ( []byte{0x01, 0x02}) 时,您没有指定长度 ( [2]byte{0x01, 0x02}),这意味着它是一个切片而不是数组。并且 slices 对象在内部包含一个指向其内容的指针。


查看完整回答
反对 回复 2021-10-25
?
浮云间

TA贡献1829条经验 获得超4个赞

切片本质上是参考事物。分配一个不会复制其内容。您可以将切片值视为“切片头”结构,其中包含指向切片底层数组的指针,以及数组内切片的偏移量和长度。复制切片时复制的是这个结构,而不是数组中的任何值。


你可以做


b := make([]byte, len(a.bs)))

copy(b, a.bs)

制作b一个新切片并将a.bs的内容复制到其中。那么你对一个人所做的任何事情都不会对另一个人产生任何影响。


查看完整回答
反对 回复 2021-10-25
  • 3 回答
  • 0 关注
  • 215 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信