如何使用一个字节的缓冲区作为映射的密钥存储?

时间:2018-10-23 08:24:07

标签: go

如何使用1个字节的缓冲区作为没有副本的映射的键存储?

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)),则该方法打印:

  

a 1   11   c 1

但是如果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))
}

函数结果:

  

c 1   1例   c 1

1 个答案:

答案 0 :(得分:2)

  

如何使用[a] ...字节[slice] ...作为地图的键...

您不能。该语言禁止将切片用作地图键,因为切片的内容可能会随手更改(这是任何地图键都必须具有的属性)。