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

使用后我们需要清除一些变量。但是当它[]byte在结构中分配一个字段时,它看起来真的很奇怪。


为什么这个赋值[]byte不是副本而是指针?


我应该怎么做才能将值保留在 struct 中a.bs,但清除bas 局部变量? http://play.golang.org/p/MT_wAHj2OM


package main


import "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{}

}


蝴蝶刀刀
浏览 216回答 3
3回答

人到中年有点甜

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

浮云间

切片本质上是参考事物。分配一个不会复制其内容。您可以将切片值视为“切片头”结构,其中包含指向切片底层数组的指针,以及数组内切片的偏移量和长度。复制切片时复制的是这个结构,而不是数组中的任何值。你可以做b := make([]byte, len(a.bs)))copy(b, a.bs)制作b一个新切片并将a.bs的内容复制到其中。那么你对一个人所做的任何事情都不会对另一个人产生任何影响。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go