2015-03-27 13 views
10

Właśnie zacząłem się uczyć Go i potrzebuję mapy ciągów znaków, które inicjuję dosłownie.Błąd golang lub zamierzona funkcja na literalnych mapach

mapa := map[string]string{ 
     "jedan":"one", 
     "dva":"two" 
     } 

Ale kompilator narzeka syntax error: need trailing comma before newline in composite literal

Musiałem więc dodać śpiączkę po "two", lub usunąć nową linię i mieć } po ostatniej wartości dla kompilatora, aby być szczęśliwym

Czy to zamierzone zachowanie kodu styl?

EDIT: być jasne follwing skompiluje i pracować

mapa := map[string]string{ 
     "jedan":"one", 
     "dva":"two" } 

go version go1.4.2 darwin/amd64 Mac OSX 10.9.5

+3

BTW: gofmt twój kod. A jeśli kiedykolwiek będziesz musiał przeczytać lub zaakceptować różnicę, zaczniesz doceniać styl Go. – Volker

+2

Go jest językiem dość opiniotwórczym. To jedna z tych opinii. Im więcej będziesz z tym walczyć, tym bardziej nie spodoba ci się język. Po prostu poddaj się Bogom i wszystko będzie dobrze. –

+0

To nie będzie gofmt 'missing ',' before newline in composite literal' – BojanT

Odpowiedz

24

Go ma średniki, ale ich nie widać, ponieważ są one automatycznie wstawiane przez lexer.

Semicolon insertion rules:

średnika zostaje automatycznie umieszczony w token strumieniem na końcu niebiałego linii, jeśli końcowy znacznik LINE jest

  • liczbą całkowitą, zmiennoprzecinkową, urojony Rune lub ciąg dosłowne

Tak to:

mapa := map[string]string{ 
    "jedan": "one", 
    "dva": "two" 
} 

jest rzeczywiście:

mapa := map[string]string{ 
    "jedan": "one", 
    "dva": "two"; // <- semicolon 
} 

Która jest nieprawidłowy Go.

+0

Doskonałe wyjaśnienie. Punkty bonusowe za odniesienie do specyfikacji. – ffledgling

13

Tak jest. I powinieneś wybrać dodany przecinek.

O wiele łatwiej jest edytować w ten sposób literaturę mapy/plasterka: można kopiować-paster, przenosić elementy bez obawy o to, że za ostatnim elementem nie powinien następować przecinek.

W rzeczywistości można to samo zrobić w PHP, javascript i wielu innych językach.

+0

Nie widzę dużej różnicy w posiadaniu jeszcze jednej nowej linii, będę edytować pytanie, które będzie bardziej szczegółowe – BojanT

+0

Chyba nikt nie zrozumiał mojego pytania, pierwszego fragment kodu nie będzie kompilowany, ale drugi się skompiluje, w PHP JS pierwszy fragment jest uzasadniony! – BojanT

+6

Cóż, twoje pytanie brzmiało: "Czy jest to zamierzone zachowanie, że muszę dodać przecinek na końcu wiersza lub usunąć znak nowej linii". Odpowiedź brzmi: tak. – Elwinar