英文:
How do I create a map[[16]byte][]string in Go?
问题
根据Go规范说明:
>比较运算符==和!=(§比较运算符)必须对键类型的操作数进行完全定义;因此,键类型不能是结构体、数组或切片。如果键类型是接口类型,则这些比较运算符必须对动态键值进行定义;否则会导致运行时恐慌。
我希望创建一个哈希值的映射,这些哈希值来自于Hash接口,该接口返回[]byte
,但是我知道所有的哈希都是用相同的算法完成的(因此我知道它适合[16]byte
)。我该如何提供适当的接口,以便map
类型允许使用[]byte
或[16]byte
或其包装类型作为键?
目前我的使用会生成以下错误:
dupes := make(map[[16]byte][]string)
<pre>finddups.go:55: invalid map key type [16]uint8</pre>
更新(2012年3月): Go1允许[16]byte
作为键类型。
英文:
The Go spec states:
>The comparison operators == and != (§Comparison operators) must be fully defined for operands of the key type; thus the key type must not be a struct, array or slice. If the key type is an interface type, these comparison operators must be defined for the dynamic key values; failure will cause a run-time panic.
I wish to create a map of hash values which come from the Hash interface, which returns []byte
, but for which all my hashes are done with the same algorithm (thereby I know that it would fit into [16]byte
). How can I provide the appropriate interface such that the map
type will allow []byte
or [16]byte
or some wrapper thereof to be used as a key?
Presently my use generates the following error:
dupes := make(map[[16]byte][]string)
<pre>finddups.go:55: invalid map key type [16]uint8</pre>
Update (Mar 2012): Go1 allows [16]byte
as key type.
答案1
得分: 4
一个string类型代表了一组UTF-8编码的字符串值。字符串的行为类似于字节的数组。有关字节切片的规则2和4,请参阅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]
注意:这个算法仅仅利用了Go语言规范中给出的字符串类型和转换的规则,所有的实现都必须满足这些规则。这是一个“技巧”,就像var i int = '7' - '0'
(对于ASCII、EBCDIC、Unicode等)是将一个数字字符'7'转换为整数值7的“技巧”,在Go语言和许多其他语言中都可以使用。
英文:
A string type represents the set of UTF-8 encoded string values. Strings behave like arrays of bytes. See rules 2 and 4 for byte slices in the Conversions to and from a string type topic in the Conversions section of The Go Language Specification.
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)
}
}
Output:
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]
Note: This algorithm merely takes advantage of the rules for string types and conversions given in The Go Language Specification, which all implementations must satisfy. It's a "trick", just like var i int = '7' - '0'
(for ASCII, EBCDIC, Unicode, etc.) is a "trick" to convert a numeric character '7' to an integer value 7, in Go and many other languages.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论