Conseils pour jouer au golf à Go


25

Quels conseils généraux avez-vous pour jouer au golf à Go? Je suis nouveau au golf de code et cherche des idées qui peuvent être appliquées aux problèmes de golf de code en général qui sont au moins quelque peu spécifiques à Go.

Veuillez conserver un pourboire par réponse.


3
Nous pourrions vouloir créer la Gobalise, mais alors, est-ce que Go est même utilisé pour jouer au golf ici?
Optimizer

@Optimizer que j'avais l' habitude
cat

3
Devrait renommer le titre en "Tips for Go-lfing"
Uriel

Réponses:


12

Inspiré par la réponse de @ EMBLEM ici .

Vous pouvez placer les fonctions d'un package dans l'espace de noms global lorsque vous les importez comme ceci:

package main

import ."fmt"

func main() {
    Printf("Hello World!")
}

9

Vous pouvez nommer les packages comme vous le souhaitez lorsque vous les importez.

package main

import f "fmt"

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

J'ai appris cela ici .


3
Vous pouvez également faire import ."fmt"et puis Printlnet le reste des fmtfonctions sont dans l'espace de noms global. De plus, vous n'avez pas besoin de points-virgules. Jamais, sauf si vous avez plusieurs relevés sur une ligne
cat

Notez que dans Golang, les accolades doivent aller sur la même ligne, en raison de l'insertion automatique du point-virgule. Plus d'informations: golang.org/doc/faq#semicolons .
cat

7

Les valeurs de retour nommées peuvent économiser quelques octets. Par exemple:

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

Vous pouvez enregistrer 3 octets avec

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

C'est plus utile si vous devez déclarer plusieurs variables au début de votre fonction.


7

Si vous avez besoin de comparer de nombreuses valeurs différentes à une seule, il peut être plus efficace d'utiliser un switchavec un seul cas.

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

2

Déclaration de plusieurs variables:

i,s:=0,""

var(i int;s string)

Int From String Conversion: (limité mais parfois utile)

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

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

Et vice versa

s:=string(9+48)

s:=strconv.Itoa(9)

fmt.Sprintest susceptible d'économiser des octets strconv.Atoi, car vous avez probablement fmtdéjà importé .
EMBLEM

@EMBLEM Je pense que strconvc'était juste pour montrer ce que serait le golf-code en code normal.
Benny Jobigan

2

Le compilateur Go a des fonctions prédéfinies printet printlnqui ne nécessitent pas d'importer fmt, donc au lieu de cela.

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

Vous pouvez écrire ceci.

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

Notez que cela sort vers STDERR.


1

Beaucoup de choses dans la boucle de plage for sont facultatives.

Version standard:

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

Si i, va déjà été défini et peut être remplacé:

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

Si vous ne vous souciez pas de la valeur:

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

Si vous ne vous souciez pas de la valeur et ia déjà été défini:

for i=range a{
// Do stuff
}

Si vous ne vous souciez pas de l'indice ou de la valeur:

for range a{
// Do stuff
}

Si vous voulez une boucle infinie:

for{
// Do stuff
}

1

Besoin d'une chaîne pour contenir une nouvelle ligne? N'écrivez pas \n, créez une chaîne brute avec des guillemets et mettez-y une nouvelle ligne littérale.

s:="\n" // 7 bytes
s:=`
` // 6 bytes

0

Vous pouvez placer n'importe quel nombre d'accolades ouvrantes sur une seule ligne, mais une ligne contenant des accolades ouvrantes peut contenir au plus une accolade fermante.

Correct:

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

Aussi correct:

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

Aussi correct:

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

Incorrect:

func main() {
    if true{for{break}}
}

0

Go a priorité différente de l' opérateur pour les opérations de bits, <<, >>, &, etc. ont généralement une priorité plus faible que +et -dans la plupart des langues, mais Go ils ont la même priorité que *et /.

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

Cela pourrait être utilisé pour enregistrer certaines parenthèses.

La plupart des langues:

(a&b)*c

Aller:

a&b*c

0

Tirez pleinement parti des fonctions de première classe de Go en attribuant des noms de fonction de bibliothèque longs aux variables à une lettre.

import."strings"
r:=Replace
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.