El Go Programming Language Specification dice:Ir: ¿qué determina el orden de iteración para las claves del mapa?
3. El orden de iteración sobre los mapas no se especifica. [...]
Eso es de esperar ya que un tipo de mapa se puede implementar como una tabla hash, o como un árbol de búsqueda, o como alguna otra estructura de datos. ¿Pero cómo se implementa realmente map
en Go?
Dicho de otra manera, lo que determina el orden de iteración de las claves en
for k, _ := range m { fmt.Println(k) }
me empezaron a preguntarse sobre esto después de que vi que un mapa con string
llaves aparentemente hacer tienen un cierto orden de iteración. Un programa como
package main
import ("fmt"; "time"; "rand")
func main() {
rand.Seed(time.Seconds())
words := [...]string{"foo", "bar", "a", "b", "c", "hello", "world",
"0", "1", "10", "100", "123"}
stringMap := make(map[string]byte)
for i := range rand.Perm(len(words)) {
stringMap[words[i]] = byte(rand.Int())
}
fmt.Print("stringMap keys:")
for k, _ := range stringMap { fmt.Print(" ", k) }
fmt.Println()
}
imprime el siguiente en mi máquina:
stringMap keys: a c b 100 hello foo bar 10 world 123 1 0
independientemente del orden de inserción.
El programa equivalente con un mapa map[byte]byte
también imprime las teclas en orden aleatorio, pero aquí el orden de las teclas depende de en el orden de inserción.
¿Cómo se implementa todo esto? ¿Es el map
especializado para enteros y para cadenas?
Interesante. ¿Podría señalar el código fuente? –
¡Gracias por los comentarios! Es bueno saber que Go 1 aleatorizará esto, ya que hace que sea mucho más fácil encontrar casos en los que confíe por error en el orden de las teclas. –
@dystoy Los códigos fuente C: http://code.google.com/p/go/source/browse/src/pkg/runtime/hashmap.c?name=release.r60.3 http://code.google .com/p/go/source/browse/src/pkg/runtime/hashmap.c? name = weekly.2012-03-04 –