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.
Nie ma potrzeby warunkowego, bardziej idiomatyczne jest po prostu wykonanie 'm [klucz] ++'. Jeśli klucz istnieje, otrzymasz zerową wartość. –