代码之家  ›  专栏  ›  技术社区  ›  Matt Joiner

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

  •  5
  • Matt Joiner  · 技术社区  · 14 年前

    围棋规范 states :

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

    我希望创建散列值的映射,这些散列值来自 Hash 接口,它返回 []byte ,但是我所有的散列都是用同一个算法完成的(因此我知道它适合 [16]byte ). 如何提供适当的接口,以便 map 类型将允许 []字节 [16]字节 或者是用来做钥匙的包装纸?

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

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

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

    1 回复  |  直到 13 年前
        1
  •  4
  •   peterSO    14 年前

    一个 string type 表示一组UTF-8编码的字符串值。字符串的行为类似于字节数组。请参阅规则2和规则4中的“与字符串类型的转换”主题中的字节片 Conversions Go语言规范的一节。

    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的“技巧”。