如何使用一个字节的缓冲区作为没有副本的映射的密钥存储?
func TestMap(t *testing.T) {
testMap := make(map[string]int)
//byteKey := make([]byte, 2)
//byteKey[0] = 0
byteKey := make([]byte, 1)
{
byteKey[0] = 'a'
key := BytesToString(byteKey)
testMap[key] += 1
}
{
byteKey[0] = 'b'
key := BytesToString(byteKey)
testMap[key] += 1
}
{
byteKey[0] = 'c'
key := BytesToString(byteKey)
testMap[key] += 1
}
for key, _ := range testMap {
println(key, testMap[key])
}
}
如果
BytesToString
只是字符串强制转换(string(buffer)),则该方法打印:1
11
11
但如果
BytesToString
具有内容:func BytesToString(b []byte) string {
bytesHeader := (*reflect.SliceHeader)(unsafe.Pointer(&b))
strHeader := reflect.StringHeader{Data: bytesHeader.Data, Len: bytesHeader.Len}
return *(*string)(unsafe.Pointer(&strHeader))
}
功能结果:
11
11
11
最佳答案
如何使用[a] ...字节[slice] ...作为键...用于映射?
你不能。该语言禁止将 slice 用作 map 键,因为 slice 的内容可能会随手更改(这是任何 map 键都必须具有的属性)。
关于go - 如何使用一个字节的缓冲区作为映射的 key 存储?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52944378/