Go规范states:
必须为键类型的操作数完全定义比较运算符==和!=(§比较运算符);因此,键类型不能是结构,数组或切片。如果密钥类型是接口类型,则必须为动态密钥值定义这些比较运算符;失败会导致运行时恐慌。
我希望创建一个哈希值的映射,它来自Hash接口,它返回[]byte
,但是我的所有哈希值都使用相同的算法完成(因此我知道它会适合[16]byte
)。如何提供适当的界面,使map
类型允许[]byte
或[16]byte
或其某些包装用作密钥?
目前我的使用会产生以下错误:
dupes := make(map[[16]byte][]string)
finddups.go:55: invalid map key type [16]uint8
更新(2012年3月): Go1允许[16]byte
作为密钥类型。
答案 0 :(得分:3)
string type表示UTF-8编码的字符串值的集合。字符串的行为类似于字节数组。有关转换语言规范的Conversions部分中的字符串类型主题的转换,请参阅规则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)
}
}
输出:
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]
注意:此算法仅利用The Go Language Specification中给出的字符串类型和转换规则,所有实现都必须满足这些规则。这是一个“技巧”,就像var i int = '7' - '0'
(对于ASCII,EBCDIC,Unicode等)是一个“技巧”,在Go和许多其他语言中将数字字符'7'转换为整数值7。