Сначала немного предыстории. Формальная грамматика Go использует точки с запятой ";"
как терминаторы во многих продуктах, но программы Go могут опускать большинство из них (и они должны иметь более четкий, легко читаемый исходный код; gofmt
также удаляются ненужные точки с запятой).
В спецификации перечислены точные правила. Спецификация: точка с запятой:
В формальной грамматике используются точки с запятой ";" в качестве ограничителей в ряде постановок. Программы Go могут опускать большинство этих точек с запятой, используя следующие два правила:
Когда ввод разбивается на токены, точка с запятой автоматически вставляется в поток токенов сразу после последнего токена строки, если этот токен
Чтобы позволить сложным операторам занимать одну строку, точку с запятой можно опустить перед закрывающими ")" или "}".
Итак, как вы можете видеть, если вы вставляете символ новой строки после круглой скобки )
, точка с запятой ;
будет вставлена автоматически, и поэтому следующая строка не будет рассматриваться как продолжение предыдущей. Это то, что произошло в вашем случае, и поэтому следующая строка, начинающаяся с .Scan(&ReadUser.ID,...
, даст вам ошибку времени компиляции, поскольку это положение само по себе (без предыдущей строки) является ошибкой времени компиляции:syntax error: unexpected .
Таким образом, вы можете разорвать линию в любой момент, который не противоречит правилам, перечисленным в пункте 1.
выше.
Как правило , вы можете разбить ваши строки после запятой ,
, после открытия скобки , например (
, [
, {
, и после точки , .
которая может быть ссылающейся на поле или метод какого - либо значения. Вы также можете разбить строку после двоичных операторов (тех, которые требуют 2 операнда), например:
i := 1 +
2
fmt.Println(i) // Prints 3
Здесь стоит отметить одну вещь: если у вас есть литерал структуры, среза или карты, в котором перечислены начальные значения, и вы хотите разорвать строку после перечисления последнего значения, вы должны поставить обязательную запятую, ,
даже если это последнее значение, а не последуют другие, например:
s := []int {
1, 2, 3,
4, 5, 6, // Note it ends with a comma
}
Это должно соответствовать правилам точки с запятой, а также для того, чтобы вы могли переставлять и добавлять новые строки, не заботясь о добавлении / удалении последней запятой; например, вы можете просто поменять местами две строки, не удаляя и не добавляя новую запятую:
s := []int {
4, 5, 6,
1, 2, 3,
}
То же самое применяется при перечислении аргументов для вызова функции:
fmt.Println("first",
"second",
"third", // Note it ends with a comma
)