2010-11-26 18 views
5

The Go spec states:¿Cómo creo un string de mapa [[16]] [] en Go?

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.

Deseo crear un mapa de valores hash que provienen de la interfaz Hash, que devuelve []byte, pero para los cuales todos mis hash se hace con el mismo algoritmo (con lo que sé que cabría en [16]byte). ¿Cómo puedo proporcionar la interfaz adecuada para que el tipo map permita []byte o [16]byte o alguna envoltura del mismo para ser utilizada como clave?

Actualmente mi uso genera el siguiente error:

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

Update (mar 2012): Go1 permite [16]byte como tipo de clave.

Respuesta

3

A string type representa el conjunto de valores de cadena codificados en UTF-8. Las cadenas se comportan como matrices de bytes. Consulte las reglas 2 y 4 para las divisiones de bytes en las conversiones ay desde un tema de tipo de cadena en la sección Conversions de 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) 
    } 
} 

Salida:

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] 

Nota: Este algoritmo sólo se aprovecha de las reglas para los tipos de cadena y conversiones dadas en The Go Language Specification, que todas las implementaciones deben satisfacer. Es un "truco", al igual que var i int = '7' - '0' (para ASCII, EBCDIC, Unicode, etc.) es un "truco" para convertir un carácter numérico '7' en un valor entero 7, en Go y en muchos otros idiomas.

+0

¿Puede explicar por qué es este el caso? Parece arbitrario convertir a un tipo mágico que sea aceptable. –

+0

@Matt, no es exactamente mágico; la especificación Go incluso dice: 'Las cadenas se comportan como matrices de bytes pero son inmutables'. Por lo tanto, estoy de acuerdo con peterSO en que este es un uso aceptable de esa conversión. Consulte http://golang.org/doc/go_spec.html#String_types – Poindexter

+0

@Poindexter: la inmutabilidad que parece ser la clave (juego de palabras no previsto). También buen nombre jajaja. –

Cuestiones relacionadas