Primeiro, algumas informações básicas. A gramática formal do Go usa ponto- ";"
e- vírgula como terminadores em muitas produções, mas os programas Go podem omitir a maioria deles (e eles devem ter uma fonte mais clara e facilmente legível; gofmt
também remove pontos-e-vírgulas desnecessários).
A especificação lista as regras exatas. Especificação: ponto e vírgula:
A gramática formal usa ponto-e-vírgula ";" como terminadores em uma série de produções. Os programas Go podem omitir a maioria desses pontos-e-vírgulas usando as duas regras a seguir:
Quando a entrada é dividida em tokens, um ponto e vírgula é inserido automaticamente no fluxo de token imediatamente após o token final de uma linha se esse token for
Para permitir que instruções complexas ocupem uma única linha, um ponto-e-vírgula pode ser omitido antes de um ")" ou "}" de fechamento.
Como você pode ver, se inserir um caractere de nova linha após o parêntese )
, um ponto-e-vírgula ;
será inserido automaticamente e a próxima linha não será tratada como a continuação da linha anterior. Isso é o que aconteceu no seu caso e, portanto, a próxima linha, começando com .Scan(&ReadUser.ID,...
, apresentará um erro de tempo de compilação, pois isso por si só (sem a linha anterior) é um erro de tempo de compilação:syntax error: unexpected .
Portanto, você pode quebrar sua linha em qualquer ponto que não entre em conflito com as regras listadas no ponto 1.
acima.
Normalmente, você pode quebrar suas linhas após a vírgula ,
, após a abertura parêntese por exemplo (
, [
, {
e, após um ponto .
que pode ser referência a um campo ou método de algum valor. Você também pode quebrar sua linha após operadores binários (aqueles que requerem 2 operandos), por exemplo:
i := 1 +
2
fmt.Println(i) // Prints 3
Uma coisa que vale a pena notar aqui é que se você tiver uma estrutura, fatia ou literal de mapa listando os valores iniciais, e quiser quebrar a linha após listar o último valor, você deve colocar uma vírgula obrigatória, ,
mesmo que este seja o último valor e não mais virão, por exemplo:
s := []int {
1, 2, 3,
4, 5, 6, // Note it ends with a comma
}
Isso deve estar em conformidade com as regras de ponto-e-vírgula e também para que você possa reorganizar e adicionar novas linhas sem ter que se preocupar em adicionar / remover a vírgula final; por exemplo, você pode simplesmente trocar as 2 linhas sem ter que remover e adicionar uma nova vírgula:
s := []int {
4, 5, 6,
1, 2, 3,
}
O mesmo se aplica ao listar argumentos para uma chamada de função:
fmt.Println("first",
"second",
"third", // Note it ends with a comma
)