2016-11-01 21 views
8
var cache = struct { 
    sync.Mutex 
    mapping map[string]string 
} { 
    mapping: make(map[string]string), 
} 

Wygląda to jak struktura z wbudowaną synchronizacją pola.Mutex, ale nie mogę się obyć wokół drugiego zestawu nawiasów klamrowych. Kompiluje i wykonuje, ale co jest? Dlaczego etykieta instrukcji make ma znaczenie (czy tak) i przecinek? Dzięki ...Jaka jest druga para nawiasów klamrowych w tej strukturze Golanga?

Odpowiedz

10

Przykład masz odpowiada:

type Cache struct { 
    sync.Mutex 
    mapping map[string]string 
} 

cache := Cache{ 
    mapping: make(map[string]string), 
} 

wyjątkiem swoim przykładzie nie zadeklarować typ Cache i zamiast mieć anonimową struct. W przykładzie, jak sprzeciwiać się do mojego Cache typu typ jest cała

struct { 
    sync.Mutex 
    mapping map[string]string 
} 

więc myśleć o drugiej pary szelek jako

cache := Cache{ 
    mapping: make(map[string]string), 
} 

części.

make ma wbudowaną funkcję, która działa podobnie do C na calloc() oba zainicjować struktury danych wypełnioną wartościami 0'd, w przypadku Go, pewne struktury danych muszą być inicjowane ten sposób nawzajem (dla większości części kodowanym) są inicjowane automatycznie wartościami 0. Pole tam jest potrzebne, aby kompilator o numerze cache.mapping był pusty map[string]string.

Przecinek tam jest częścią formatowania Go, możesz zrobić Cache{mapping: make(map[string]string)} wszystko w jednym wierszu, ale w momencie przypisania pola jest w innej linii niż nawiasy otwierające i zamykające, wymaga przecinka.

+1

Nitpick: wartości w Go nie są "inizialized with 0'd values", ponieważ 'calloc()' does; są one inicjalizowane za pomocą tak zwanych "wartości zerowych" dla ich poszczególnych typów. Te wartości zerowe mogą się różnić od "wszystkich bajtów w podstawowej części pamięci wynosi 0". – kostix

+0

@kostix tak, mówimy to samo, po prostu inaczej. –

-1

Nazywa się to "struct literal" lub "anonimową strukturą" i tak naprawdę zawsze tworzysz struktury w Go, może to nie być od razu oczywiste, ponieważ możesz być przyzwyczajony do tworzenia nowych typów dla struct typy, które sprawiają, że deklarowanie ich jest nieco mniej szczegółowe.

Cała definicja struct jest w rzeczywistości typem w Go, podobnie jak int lub []byte lub string. Tak jak można zrobić:

type NewType int 
var a NewType = 5 // a is a NewType (which is based on an int) 

czyli

a := 5 // a is an int 

i oba są różne typy, które wyglądają jak wskazówki, można również zrobić to samo z kodowanym:

// a is type NewType (which is a struct{}). 
type NewType struct{ 
    A string 
} 
a := NewType{ 
    A: "test string", 
} 

// a is type struct{A string} 
a := struct{ 
    A string 
}{ 
    A: "test string", 
} 

się nazwa typu (NewType) została właśnie zastąpiona typem samej struktury, struct{A string}. Zauważ, że nie są one tego samego typu (alias) w celu porównania lub przypisania, ale dzielą tę samą semantykę.

+1

To jest dokładnie to samo, co pierwsza odpowiedź brzmi: dlaczego musiałeś to opublikować? –

+0

Ponieważ uważałem, że wyjaśnienie go w inny sposób (przez porównanie go z prostym typem, na przykład, że ludzie intuicyjnie rozumieją easyir) może pomóc niektórym ludziom. Nie ma nic złego w posiadaniu wielu podobnych odpowiedzi na stronach StackExchange, w rzeczywistości jest to zachęcane. –

Powiązane problemy