Consejos para jugar golf en Go

25

¿Qué consejos generales tienes para jugar al golf en Go? Soy nuevo en Code Golfing y busco ideas que se puedan aplicar a los problemas de code golf en general que sean al menos algo específicos para Go.

Por favor, mantenga un consejo por respuesta.

Sheharyar
fuente
3
Es posible que queramos crear la Goetiqueta, pero entonces, ¿se está utilizando Go para jugar al golf aquí?
Optimizador
@Optimizer que solía
gato
3
Debería cambiar el nombre del título a "Consejos para Go-lfing"
Uriel

Respuestas:

12

Inspirado por la respuesta de @ EMBLEM aquí .

Puede colocar las funciones de un paquete en el espacio de nombres global cuando las importe de la siguiente manera:

package main

import ."fmt"

func main() {
    Printf("Hello World!")
}
George Gibson
fuente
9

Puede nombrar paquetes como desee cuando los importe.

package main

import f "fmt"

func main() {
    f.Printf("Hello World\n")
}

Aprendí esto aquí .

EMBLEMA
fuente
3
También puede hacer import ."fmt"y luego Printlny el resto de fmtlas funciones están en el espacio de nombres global. Además, no necesita punto y coma. Nunca, a menos que tenga varias declaraciones en una línea
cat
Tenga en cuenta que en Golang, las llaves deben ir en la misma línea, debido a la inserción automática de punto y coma. Más información: golang.org/doc/faq#semicolons .
gato
7

Los valores de retorno con nombre pueden guardar algunos bytes. Por ejemplo:

func x()string{
r:="" //Do stuff
return r}

Puede guardar 3 bytes con

func x()(r string){
//Do stuff
return}

Es más útil si necesita declarar múltiples variables al comienzo de su función.

EMBLEMA
fuente
7

Si necesita comparar muchos valores diferentes con uno solo, puede ser más eficiente en el uso del espacio switchcon un solo caso.

if x==1||x==2||x==3||x==4{}
switch x{case 1,2,3,4:}
EMBLEMA
fuente
2

Declarando Múltiples Variables:

i,s:=0,""

var(i int;s string)

Int de conversión de cadena: (limitado pero a veces útil)

n:=byte("9"[0])-48 // actual type is uint8

n,_:=strconv.Atoi("9")

Y viceversa

s:=string(9+48)

s:=strconv.Itoa(9)
Justin Powell
fuente
fmt.Sprintes probable que guarde bytes strconv.Atoi, porque es probable que fmtya haya importado .
EMBLEMA
@EMBLEM Creo que strconvestaba allí solo para mostrar cuál sería el código de golf en el código normal.
Benny Jobigan
2

El compilador Go tiene funciones printy printlnfunciones predefinidas que no requieren importar fmt, así que en lugar de esto.

package main
import."fmt"
func main(){Printf(`Hello World
`)}

Puedes escribir esto.

package main
func main(){print(`Hello World
`)}

Tenga en cuenta que esto se envía a STDERR.

Konrad Borowski
fuente
1

Muchas cosas en el bucle for range son opcionales.

Versión estándar:

for i,v:=range a{
// Do stuff
}

Si i, vya se ha definido y se puede sobrescribir:

for i,v=range a{
// Do stuff
}

Si no te importa el valor:

for i:=range a{
// Do stuff
}

Si no le importa el valor y iya se ha definido:

for i=range a{
// Do stuff
}

Si no le importa el índice o el valor:

for range a{
// Do stuff
}

Si quieres un bucle infinito:

for{
// Do stuff
}
JayXon
fuente
1

¿Necesita una cadena para contener una nueva línea? No escriba \n, cree una cadena sin formato con comillas inversas y ponga una nueva línea literal en ella.

s:="\n" // 7 bytes
s:=`
` // 6 bytes
P púrpura
fuente
0

Puede colocar cualquier número de llaves de apertura en una línea, pero una línea que contiene llaves de apertura puede contener como máximo una llave de cierre.

Correcto:

func main(){if true{switch{case 1==1:for{break
}}}}

También correcto:

func main(){if true{switch{case 1==1:for{break}
}}}

También correcto:

func main(){if true{switch{case 1==1:for{
break}}}}

Incorrecto:

func main() {
    if true{for{break}}
}
EMBLEMA
fuente
0

Go tiene diferente precedencia de los operadores para operaciones de bits, <<, >>, &, etc por lo general tienen menor precedencia que +y -en la mayoría de los idiomas, pero en Ir tienen la misma precedencia que *y /.

Precedence    Operator
5             *  /  %  <<  >>  &  &^
4             +  -  |  ^
3             ==  !=  <  <=  >  >=
2             &&
1             ||

Esto podría usarse para guardar algunos paréntesis.

La mayoría de los idiomas:

(a&b)*c

Ir:

a&b*c
JayXon
fuente
0

Aproveche al máximo las funciones de primera clase de Go asignando nombres largos de funciones de biblioteca a variables de una letra.

import."strings"
r:=Replace
P púrpura
fuente