如何在Go中创建地图[[16] byte] []字符串?

Mat*_*ner 5 map go

Go规范指出:

必须为键类型的操作数完全定义比较运算符==和!=(§比较运算符); 因此,键类型不能是结构,数组或切片.如果密钥类型是接口类型,则必须为动态密钥值定义这些比较运算符; 失败会导致运行时恐慌.

我希望创建一个来自Hash接口的哈希值映射,它返回[]byte,但是我的所有哈希都是用相同的算法完成的(因此我知道它适合[16]byte).如何提供适当的接口,使map类型允许[]byte或将[16]byte其某些包装用作密钥?

目前我的使用会产生以下错误:

dupes := make(map[[16]byte][]string)
Run Code Online (Sandbox Code Playgroud)
finddups.go:55: invalid map key type [16]uint8

更新(2012年3月): Go1允许[16]byte作为密钥类型.

pet*_*rSO 4

字符串类型表示 UTF-8 编码字符串值的集合。字符串的行为类似于字节数组。请参阅《Go 语言规范》转换部分中与字符串类型之间的转换主题中的字节切片规则 2 和 4 。

package main

import "fmt"

func main() {
    dupes := make(map[string][]string)

    hash := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
    dupes[string(hash)] = []string{"a", "b"}
    hash[len(hash)-1]++
    dupes[string(hash)] = []string{"b", "c"}

    fmt.Println("len:", len(dupes))
    for k, v := range dupes {
        fmt.Println("key:", []byte(k), "value:", v)
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

len: 2
key: [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 16] value: [b c]
key: [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15] value: [a b]
Run Code Online (Sandbox Code Playgroud)

注意:该算法仅利用Go 语言规范中给出的字符串类型和转换规则,所有实现都必须满足这些规则。这是一个“技巧”,就像var i int = '7' - '0'(对于 ASCII、EBCDIC、Unicode 等)在 Go 和许多其他语言中将数字字符“7”转换为整数值 7 的“技巧”一样。