Go 如何将[]字节转换为[16]字节?

Go 如何将[]字节转换为[16]字节?,go,Go,我有以下代码: func my_function(hash string) [16]byte { b, _ := hex.DecodeString(hash) return b // Compile error: fails since [16]byte != []byte } b的类型将为[]字节。我知道hash的长度是32。我怎样才能使我上面的代码工作?我可以从一般长度的字节数组转换为固定长度的字节数组吗?我对分配16个新字节并复制数据不感兴趣。没有直接的方法将切片转换

我有以下代码:

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

b
的类型将为
[]字节
。我知道
hash
的长度是32。我怎样才能使我上面的代码工作?我可以从一般长度的字节数组转换为固定长度的字节数组吗?我对分配16个新字节并复制数据不感兴趣。

没有直接的方法将切片转换为数组。不过,你可以复印一份

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

标准库使用[]字节,如果您坚持使用其他内容,那么您将需要进行更多的键入。我写了一个程序,用数组来表示我的md5值,我后悔了。

就像把一个切片复制到一个数组一样?不,我不想抄袭。在问题中添加了这一点。如果没有
不安全
,则无法转换。切片头本身在amd64上是24个字节,当
hex.DecodeString
返回时被复制到堆栈中,而散列本身要比复制16个字节的结果昂贵得多;我会选择你的战斗,不要太担心这个。请注意,你通常可以通过对数组变量进行切片(例如,
foo[:]
)来确保你收到的数据最终进入数组变量。当您出于性能原因想要实际使用数组,但仍然希望将
Read()
Write()
写入数组时,这非常有用。