Najpierw trochę tła. Formalna gramatyka Go używa średników ";"
jako terminatorów w wielu produkcjach, ale programy Go mogą pomijać większość z nich (i powinny mieć jaśniejsze, łatwe do odczytania źródło; gofmt
usuwa również niepotrzebne średniki).
Specyfikacja zawiera dokładne zasady. Specyfikacja: Średniki:
Gramatyka formalna używa średników ";" jako terminatory w wielu produkcjach. Programy Go mogą pomijać większość tych średników, korzystając z następujących dwóch reguł:
Gdy dane wejściowe są podzielone na tokeny, średnik jest automatycznie wstawiany do strumienia tokenów natychmiast po ostatnim tokenie wiersza, jeśli ten token jest
- identyfikator
- całkowitą , zmiennoprzecinkową , wyimaginowany , runa , lub łańcuch dosłowny
- jednym z kluczowych
break
, continue
, fallthrough
, lubreturn
- jeden z operatorów i ograniczników ++, -,),] lub}
Aby umożliwić złożonym instrukcjom zajmowanie jednego wiersza, przed zamykającym „)” lub „}” można pominąć średnik.
Jak więc widzisz, wstawiając znak nowej linii po nawiasie )
, średnik ;
zostanie wstawiony automatycznie, a więc następny wiersz nie będzie traktowany jako kontynuacja poprzedniego wiersza. Tak właśnie stało się w twoim przypadku, więc następna linia zaczynająca się od .Scan(&ReadUser.ID,...
da ci błąd w czasie kompilacji, ponieważ ta stojąca sama (bez poprzedniej linii) jest błędem kompilacji:syntax error: unexpected .
Możesz więc przerwać linię w dowolnym momencie, co nie jest sprzeczne z zasadami wymienionymi w punkcie 1.
powyżej.
Zazwyczaj można złamać swoje linie po przecinku ,
, po otwarcie nawiasie np (
, [
, {
, i po kropce .
, które mogą być odnoszącego się do pola lub metody pewnej wartości. Możesz również podzielić linię po operatorach binarnych (tych, które wymagają 2 operandów), np:
i := 1 +
2
fmt.Println(i) // Prints 3
Jedną rzeczą wartą odnotowania jest to, że jeśli masz strukturę, wycinek lub literał mapy wymieniający początkowe wartości i chcesz przerwać wiersz po wypisaniu ostatniej wartości, musisz wstawić obowiązkowy przecinek, ,
nawet jeśli jest to ostatnia wartość i nie nastąpi więcej, np .:
s := []int {
1, 2, 3,
4, 5, 6, // Note it ends with a comma
}
Ma to na celu zapewnienie zgodności z regułami dotyczącymi średników, a także umożliwia zmianę kolejności i dodawanie nowych wierszy bez konieczności zajmowania się dodawaniem / usuwaniem ostatniego przecinka; np. możesz po prostu zamienić 2 wiersze bez konieczności ich usuwania i dodać nowy przecinek:
s := []int {
4, 5, 6,
1, 2, 3,
}
To samo dotyczy wypisywania argumentów do wywołania funkcji:
fmt.Println("first",
"second",
"third", // Note it ends with a comma
)