Al igual que C, la gramática formal de Go usa punto y coma para terminar declaraciones, pero a diferencia de C, esos punto y coma no aparecen en la fuente. En cambio, Lexer utiliza una regla simple para insertar puntos y coma automáticamente mientras escanea, por lo que el texto de entrada está prácticamente libre de ellos.
La regla es esta. Si el último token antes de una nueva línea es un identificador (que incluye palabras como int y float64), un literal básico como un número o una cadena constante, o uno de los tokens
break continue fallthrough return ++ -- ) }
el lexer siempre inserta un punto y coma después del token. Esto podría resumirse como "si la nueva línea viene después de un token que podría finalizar una declaración, inserte un punto y coma".
También se puede omitir un punto y coma inmediatamente antes de una llave de cierre, por lo que una declaración como
go func() { for { dst <- <-src } }()
no necesita punto y coma. Los programas idiomáticos de Go tienen punto y coma solo en lugares como cláusulas de bucle for, para separar los elementos inicializador, condición y continuación. También son necesarios para separar varias declaraciones en una línea, en caso de que escriba el código de esa manera.
Una consecuencia de las reglas de inserción de punto y coma es que no se puede colocar la llave de apertura de una estructura de control (if, for, switch o select) en la línea siguiente. Si lo hace, se insertará un punto y coma antes del aparato ortopédico, lo que podría provocar efectos no deseados.
if i < f() {
g()
}
así no
if i < f() // wrong!
{ // wrong!
g()
}