Tipps zum Golfen in Go

25

Welche allgemeinen Tipps haben Sie zum Golfen in Go? Ich bin neu in Code Golfing und suche nach Ideen, die bei Code-Golf-Problemen im Allgemeinen angewendet werden können, die zumindest etwas spezifisch für Go sind.

Bitte halten Sie sich an einen Tipp pro Antwort.

Sheharyar
quelle
3
Vielleicht möchten wir das GoTag erstellen , aber wird Go hier überhaupt zum Golfen verwendet?
Optimierer
@Optimizer Ich pflegte
Katze
3
Sollte den Titel in "Tips for Go-lfing" umbenennen
Uriel

Antworten:

12

Inspiriert von der Antwort von @ EMBLEM hier .

Sie können die Funktionen eines Pakets in den globalen Namespace einfügen, wenn Sie sie wie folgt importieren:

package main

import ."fmt"

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

Sie können Pakete beim Import beliebig benennen.

package main

import f "fmt"

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

Das habe ich hier gelernt .

EMBLEM
quelle
3
Sie können auch import ."fmt"und dann ausführen, Printlnund der Rest der fmtFunktionen befindet sich im globalen Namespace. Außerdem benötigen Sie keine Semikolons. Es sei denn, Sie haben mehrere Aussagen in einer Zeile
Katze
Beachten Sie, dass in Golang geschweifte Klammern aufgrund des automatischen Einfügens von Semikolons in derselben Zeile stehen müssen . Weitere Informationen: golang.org/doc/faq#semicolons .
Katze
7

Mit benannten Rückgabewerten können einige Bytes eingespart werden. Beispielsweise:

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

Mit können Sie 3 Bytes einsparen

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

Dies ist nützlicher, wenn Sie zu Beginn Ihrer Funktion mehrere Variablen deklarieren müssen.

EMBLEM
quelle
7

Wenn Sie viele verschiedene Werte mit einem einzigen vergleichen müssen, ist es möglicherweise platzsparender, a switchfür einen einzelnen Fall zu verwenden.

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

Mehrere Variablen deklarieren:

i,s:=0,""

var(i int;s string)

Int From String Conversion: (eingeschränkt, aber manchmal hilfreich)

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

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

Und umgekehrt

s:=string(9+48)

s:=strconv.Itoa(9)
Justin Powell
quelle
fmt.Sprintwird wahrscheinlich Bytes sparen strconv.Atoi, weil Sie wahrscheinlich fmtbereits importiert haben .
EMBLEM
@EMBLEM Ich denke, es strconvwar nur da, um zu zeigen, wie der Golf-Code im normalen Code wäre.
Benny Jobigan
2

Go Compiler hat vordefiniert print und printlnFunktionen , die nicht erfordern fmt importieren, so dass anstelle dieser.

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

Sie können dies schreiben.

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

Beachten Sie, dass dies an STDERR ausgegeben wird.

Konrad Borowski
quelle
1

Vieles in der for-Range-Schleife ist optional.

Standard Version:

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

Wenn i, vwurde bereits definiert und kann überschrieben werden:

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

Wenn Ihnen der Wert egal ist:

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

Wenn Ihnen der Wert egal ist und ibereits definiert wurde:

for i=range a{
// Do stuff
}

Wenn Sie sich nicht für Index oder Wert interessieren:

for range a{
// Do stuff
}

Wenn Sie eine Endlosschleife wollen:

for{
// Do stuff
}
JayXon
quelle
1

Benötigen Sie eine Zeichenfolge, die eine neue Zeile enthält? Schreiben Sie nicht \n, erstellen Sie einen rohen String mit Anführungszeichen und setzen Sie einen wörtlichen Zeilenumbruch ein.

s:="\n" // 7 bytes
s:=`
` // 6 bytes
Lila P
quelle
0

Sie können eine beliebige Anzahl von öffnenden Klammern in eine Zeile einfügen, aber eine Zeile, die öffnende Klammern enthält, darf höchstens eine schließende Klammer enthalten.

Richtig:

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

Auch richtig:

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

Auch richtig:

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

Falsch:

func main() {
    if true{for{break}}
}
EMBLEM
quelle
0

Go unterschiedliche Betreiber Vorrang für Bit - Operationen hat, <<, >>, &etc. haben in der Regel niedrigere Priorität als +und -in den meisten Sprachen, aber in Go sie haben die gleiche Priorität wie *und /.

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

Dies könnte verwendet werden, um einige Klammern zu speichern.

Die meisten Sprachen:

(a&b)*c

Gehen:

a&b*c
JayXon
quelle
0

Nutzen Sie die erstklassigen Funktionen von Go in vollem Umfang, indem Sie langen Bibliotheksfunktionsnamen Variablen mit einem Buchstaben zuweisen.

import."strings"
r:=Replace
Lila P
quelle