如何将 []byte 转换为 [16]byte?

6

我有这段代码:

func my_function(hash string) [16]byte {
    b, _ := hex.DecodeString(hash)
    return b   // Compile error: fails since [16]byte != []byte
}

b 的类型将会是 []byte。我知道 hash 的长度为32。我该如何让上面的代码工作?也就是说,我能不能以某种方式从长度不固定的字节数组转换为定长的字节数组?我不想分配16个新的字节并复制数据。


像将一个切片复制到一个数组中一样吗?https://dev59.com/ymIk5IYBdhLWcg3wqPsi#21399657 - VonC
不,我更喜欢不复制。我已经将这个加入到问题中了。 - Ztyx
2
不使用unsafe是不能转换的。在amd64上,切片头本身有24个字节,并且当 hex.DecodeString 返回时会被复制到堆栈中,哈希本身要比复制16字节的结果消耗更多的资源;我会选择打好你的战斗,不要太担心这个问题。 - twotwotwo
1个回答

13

没有直接将切片转换为数组的方法。但是,您可以进行复制。

var ret [16]byte
copy(ret[:], b)

标准库使用 []byte,如果你坚持使用其他东西,那么你需要打更多的字。我曾经使用数组来存储 md5 值,但后悔了。

标准库使用 []byte,如果您坚持使用其他内容,则需要输入更多内容。我曾经使用数组来存储我的md5值,但后悔了。


1
请注意,您通常可以通过切片数组变量(例如foo[:])来确保接收到的数据最终存储在数组变量中。当您想要实际使用数组以提高性能但仍然希望进行Read()Write()操作时,这非常有用。 - fuz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接