2012-10-01 13 views
30

Me gustaría crear un mapa de container/list.List instancias. ¿Es esta la forma correcta de hacerlo?Crear un mapa Golang de Listas

package main 

import (
    "fmt" 
    "container/list" 
) 

func main() { 
    x := make(map[string]*list.List) 

    x["key"] = list.New() 
    x["key"].PushBack("value") 

    fmt.Println(x["key"].Front().Value) 
} 
+0

seguro, pero no puedo dejar de preguntarse por qué se necesita tal cosa a menos que estuvieras haciendo un procesamiento realmente ambiguo – dskinner

+1

Enhorabuena, tu código simplemente [funciona] (http://play.golang.org/p/EuYA92BTOR). – zzzz

+1

Claro, pero ¿es la forma * correcta * de hacer esto? – Carson

Respuesta

58

Siempre he querido utilizar un List He encontrado que una rebanada fue la elección correcta, por ejemplo

package main 

import "fmt" 

func main() { 
    x := make(map[string][]string) 

    x["key"] = append(x["key"], "value") 
    x["key"] = append(x["key"], "value1") 

    fmt.Println(x["key"][0]) 
    fmt.Println(x["key"][1]) 
} 
8

no hay nada técnicamente incorrecta sobre lo que ha escrito, pero debe Defina su propio tipo alrededor de map[string]*list.List para evitar algunas trampas, como intentar llamar al método .Front() en un puntero nulo. O hazlo map[string]list.List para evitar esa situación. Una lista.Lista es solo un par de punteros y un valor de longitud; utilizando una lista. El puntero de lista en el mapa solo agrega el caso extra de un puntero nulo en la parte superior de la caja de una lista vacía. En cualquier situación, debe definir una nueva estructura para este caso de uso.

me inclinaría a escribir así: http://play.golang.org/p/yCTYdGVa5G

1

Mi favorito de la sintaxis para declarar un mapa de sectores:

mapOfSlices := map[string][]string{ 
    "first": {}, 
    "second": []string{"one", "two", "three", "four", "five"}, 
    "third": []string{"quarter", "half"}, 
}