coding-style - traductor - tradusir en ingles
¿Por qué Golang impone que el corchete no esté en la siguiente línea? (4)
¿Por qué hay llaves pero no hay punto y coma? ¿Y por qué no puedo poner la abrazadera de apertura en la siguiente línea?
Go usa corchetes para agrupar enunciados, una sintaxis familiar para los programadores que han trabajado con cualquier lenguaje en la familia C. Sin embargo, los puntos y coma son para analizadores, no para personas, y queríamos eliminarlos tanto como sea posible. Para lograr este objetivo, Go toma prestado un truco de BCPL: los puntos y coma que las declaraciones separadas están en la gramática formal pero se inyectan automáticamente, sin mirar hacia delante, por el lexer al final de cualquier línea que podría ser el final de una declaración. Esto funciona muy bien en la práctica, pero tiene el efecto de que fuerza un estilo de refuerzo. Por ejemplo, la llave de apertura de una función no puede aparecer en una línea por sí misma.
correcto:
if(true) {
}
incorrecto:
if(true)
{
}
¿Por qué se aplica este estilo, tiene algo que ver con la especificación del idioma o solo porque prefieren un estilo sobre otro?
Creo que esto es solo una excusa para hacer que las personas que aman el estilo K&R no tengan que ver el estilo de Allman. Si al diseñador (s) le hubiera gustado el estilo Allman, entonces él o ella simplemente habrían hecho que el analizador se ocupara de él. Imagínese si XML fue escrito en K&R. Parecería imposible de comprender. El estilo de Allman es mucho más fácil y rápido de leer. Parece que esta es una decisión totalmente emocional. Haré una también: ignorar Ir.
La mayoría de los idiomas descendidos en C usan el estilo if ( <condition> ) <statement>
, la statement
se ejecuta si la condition
es verdadera. La statement
puede ser una instrucción única o un bloque cerrado de refuerzo.
Las declaraciones de Go''s requieren un bloque cerrado siguiente, no una sola instrucción. Esto es para evitar un error común que la mayoría de las guías de estilo tratan de evitar al exigir que todas las sentencias if
usen llaves.
//subtle error in C
if (<condition>)
<statement1>;
<statement2>;
Ahora que Go requiere un bloque de refuerzo después de la sentencia if
, ()
son redundantes. Solo sirven para ayudar al lexer a diferenciar entre la condición y la declaración, de lo contrario if <condition> <statement>
es difícil de analizar. (¿Dónde termina la condición y comienza la declaración?)
Ahora los autores de Go tienen una decisión que tomar:
- Mantener el redundante
()
- requiere
{
para seguir la<condition>
Decidieron que la redundancia no era deseable. Esto tuvo un segundo efecto secundario. Ya que hay un implícito ;
en cada nueva línea, si el {
está en la siguiente línea a ;
se pone entre la <condition>
y la {
. Los autores de Go se enfrentan nuevamente a una decisión:
- caso especial el analizador para ser inteligente acerca de la
<condition>; {
<condition>; {
construir - Exigir que todos adopten un estilo común de
if ... {
en la misma línea. - requiere que la
<condition>
esté en una sola línea.
La carcasa especial del analizador es algo muy malo. Observe los analizadores de velocidad D y Go en comparación con el terrible rendimiento del analizador de C ++. También un estilo uniforme es algo bueno. Su decisión final es bastante simple dadas las restricciones.
Tiene que ver con la Spec , es decir, no es solo algo que incorporaron en sus compiladores
Punto y coma
La gramática formal utiliza puntos y coma ";" Como terminadores en una serie de producciones. Los programas de Go pueden omitir la mayoría de estos puntos y coma usando las siguientes dos reglas:
Cuando la entrada se divide en tokens, se inserta automáticamente un punto y coma en el flujo del token al final de una línea que no está en blanco si el token final de la línea es
- un identificador
- un entero, coma flotante, imaginario, runa o cadena literal
- una de las palabras clave se rompe, continúa, falla o regresa
- uno de los operadores y delimitadores ++, -,),], o}
Para permitir que las declaraciones complejas ocupen una sola línea, se puede omitir un punto y coma antes del cierre ")" o "}".
Para reflejar el uso idiomático, los ejemplos de código en este documento eligen los puntos y coma usando estas reglas.
En la medida en que lo entendí en sus charlas, querían deshacerse de las discusiones de formato y extendieron la idea con la creación de gofmt