2010-08-18 7 views
13

Szukam funkcji języka go podobnego do "słownika" w pythonie, aby ułatwić konwersję niektórych kodu Pythona.Czy istnieją biblioteki id, które udostępniają funkcję tablic asocjacyjnych?

EDYCJA: Mapy działały całkiem dobrze w przypadku tej aplikacji usuwania duplikatów. Udało mi się skondensować zduplikowane elementy 1.3e6 w dół do 2,5e5 unikatowych przedmiotów, używając mapy z 16-bitowym indeksem ciągu w ciągu kilku sekund. Kod związany z mapą był prosty, więc dodałem go poniżej. Warto zauważyć, że wstępne przeznaczenie mapie z 1.3e6 elementy pędził go jedynie o kilka procent:

var m = make(map[string]int, 1300000) // map with initial space for 1.3e6 elements 

ct, ok := m[ax_hash] 
if ok { 
    m[ax_hash] = ct + 1 
} else { 
    m[ax_hash] = 1 
} 
+0

Nie ma potrzeby warunkowego, bardziej idiomatyczne jest po prostu wykonanie 'm [klucz] ++'. Jeśli klucz istnieje, otrzymasz zerową wartość. –

Odpowiedz

9

Typ mapy. http://golang.org/doc/effective_go.html#maps

Istnieje pewna różnica z pytona tym, że klucze mają być wpisane, więc nie można mieszać numeryczna i klawisze strunowe (z jakiegoś powodu Zapomniałem można), ale są one bardzo łatwe w użyciu .

dict := make(map[string]string) 
dict["user"] = "so_user" 
dict["pass"] = "l33t_pass1" 
+1

Możesz utworzyć mapę {string} interfejsu {}, aby zawierała mieszane typy, jeśli nie masz nic przeciwko zapewnieniom typu, przełącznikom typu, a nawet refleksowi, aby uzyskać ponownie wartości. –

+0

Wszystkie klucze będą wartościami łańcuchowymi, więc myślę, że to będzie działać dobrze – Hotei

+0

@ Chrnecha yah, ja właśnie nawiązałem do rodzaju kluczy. Używam map [string] interface {} całkiem sporo – cthom06

29

Aby rozwinąć trochę odpowiedzi już podanych:

A Go mapa jest wpisany hash struktury danych map. Sygnatura typu mapy ma postać map[keyType]valueType, gdzie keyType i valueType są odpowiednio typami kluczy i wartości.

zainicjować mapę, należy użyć funkcji make:

m := make(map[string]int) 

niezainicjowany mapa jest równa nil, a jeśli odczytywania lub zapisywania panika nastąpi w czasie wykonywania.

Składnia do przechowywania wartości jest tak samo jak robi to z tablic lub plasterki:

m["Alice"] = 21 
m["Bob"] = 17 

Podobnie pobierania wartości z mapy odbywa się w taki sposób:

a := m["Alice"] 
b := m["Bob"] 

Można użyć słowo kluczowe range iteracyjne nad mapą z for pętli:

for k, v := range m { 
    fmt.Println(k, v) 
} 

Ten kod wypisze:

Alice 21 
Bob 17 

Odzyskiwanie wartość klucza, który nie jest na mapie powróci typ wartości za zerową wartość:

c := m["Charlie"] 
// c == 0 

Czytając wiele wartości z mapy, można przetestuj obecność klucza.Druga wartość będzie logiczną wskazującą obecność kluczem jest:

a, ok := m["Alice"] 
// a == 21, ok == true 
c, ok := m["Charlie"] 
// c == 0, ok == false 

Aby usunąć wpis klucz/wartość z mapy, należy obrócić go dookoła i przypisać false jako drugą wartość:

m["Bob"] = 0, false 
b, ok := m["Bob"] 
// b == 0, ok == false 

Ty może przechowywać dowolne typy w mapie za pomocą pustego typ interfejsu interface{}:

n := make(map[string]interface{}) 
n["One"] = 1 
n["Two"] = "Two" 

Jedyne zastrzeżenie jest to, że podczas pobierania tych wartości należy przeprowadzić typu twierdzenie do korzystania z nich w ich oryginalnej postaci:

a := n["One"].(int) 
b := n["Two"].(string) 

Można użyć przełącznika typu w celu określenia rodzajów wartościami jesteś ciągnących się i radzić sobie z nimi odpowiednio:

for k, v := range n { 
    switch u := v.(type) { 
     case int: 
      fmt.Printf("Key %q is an int with the value %v.\n", k, u) 
     case string: 
      fmt.Printf("Key %q is a string with the value %q.\n", k, u) 
    } 
} 

Wewnątrz każdego z tych blokówbędzie typu określonego w instrukcji case; nie jest wymagana jawna asercja typu.

Ten kod wypisze:

Key "One" is an int with the value 1. 
Key "Two" is a string with the value "Two". 

Kluczem może być dowolnego typu, dla którego operator równości jest zdefiniowany, takich jak liczby całkowite, pływaków, ciągi i wskaźniki. Można również stosować typy interfejsów, o ile typ podstawowy obsługuje równość. (Kodowanym, tablice i plastry nie mogą być używane jako klucze map, ponieważ równość nie jest zdefiniowana na tych typów.)

Na przykład mapę o mogą wziąć klucze od któregokolwiek z powyższych typów:

o := make(map[interface{}]int) 
o[1] = 1 
o["Two"] = 2 

A to mapy w pigułce.

+0

Bardziej przypominające mapy i przełączniki typu w pigułce, z odrobiną pustej planszy {}. Doskonała odpowiedź. – cthom06

+0

+1 dla interfejsu {} klucz, fajnie, ominąłem to dzięki – zupa