Map 如何在Go中创建映射[[16]字节][]字符串?

Map 如何在Go中创建映射[[16]字节][]字符串?,map,go,Map,Go,Go规范: 比较运算符==和!=(§比较运算符)必须为键类型的操作数完全定义;因此,键类型不能是结构、数组或切片。如果键类型是接口类型,则必须为动态键值定义这些比较运算符;失败将导致运行时恐慌 我希望创建一个来自接口的哈希值映射,该映射返回[]字节,但所有哈希都是用相同的算法完成的(因此我知道它将适合[16]字节)。我如何提供适当的接口,使映射类型允许[]字节或[16]字节或其某些包装器用作密钥 目前,我的使用产生以下错误: dupes := make(map[[16]byte][]string

Go规范:

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

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

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

dupes := make(map[[16]byte][]string)
finddups.go:55:无效的映射键类型[16]uint8
更新(2012年3月):Go1允许
[16]字节
作为密钥类型。

A表示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)
    }
}
输出:

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]

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

你能解释为什么会这样吗?转换成可以接受的魔法类型似乎是武断的。@Matt,这不完全是魔法;Go规范甚至说:
字符串的行为类似于字节数组,但不可变。因此,我同意彼得索的观点,这是一种可以接受的转换方式。请参阅@Poindexter:它看起来的不变性是关键(双关语不是有意的)。还不错的名字哈哈哈。
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]