Go Golf için ipuçları


25

Go'da golf oynamak için hangi genel ipuçlarınız var? Code Golfing konusunda yeniyim ve genel olarak golfle ilgili sorunları çözmek için en azından bir şekilde Go'ya özgü olan fikirleri arayacağım.

Lütfen cevap başına bir ipucuna uyun.


3
GoEtiketi oluşturmak isteyebiliriz , fakat o zaman Go burada golf oynamak için bile kullanılıyor mu?
Doktor

@Optimizer Eskiden
kedi

3
Başlığı "Go-lfing için İpuçları" olarak değiştirmelidir
Uriel

Yanıtlar:


12

Buradaki @ EMBLEM'in cevabından ilham alındı .

Bir paketin fonksiyonlarını global isim alanına şu şekilde koyabilirsiniz:

package main

import ."fmt"

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

9

Paketleri içe aktarırken ne istersen adlandırabilirsin.

package main

import f "fmt"

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

Bunu burada öğrendim .


3
Ayrıca import ."fmt"ve sonra yapabilirsiniz ve Printlngeri kalan fmtfonksiyonlar global isim alanındadır. Ayrıca, noktalı virgül gerekmez. Hiç, bir hatta birden fazla
cat

Golang'da, parantezlerin , otomatik noktalı virgül ekleme nedeniyle aynı satıra gitmesi gerektiğini unutmayın . Daha fazla bilgi: golang.org/doc/faq#semicolons .
kedi,

7

Adlandırılmış dönüş değerleri birkaç bayt kaydedebilir. Örneğin:

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

3 bayt ile kaydedebilirsiniz.

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

İşlevinizin başında birden fazla değişken bildirmeniz gerekiyorsa daha kullanışlıdır.


7

Birçok farklı değeri tek bir değerle karşılaştırmanız gerekirse, switchtek bir durumda bir tane kullanmak daha alan açısından verimli olabilir .

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

2

Birden Fazla Değişken Bildirmek:

i,s:=0,""

var(i int;s string)

Dize Dönüşümünden İnt: (sınırlı ama bazen yararlı)

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

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

Ve Versa

s:=string(9+48)

s:=strconv.Itoa(9)

fmt.SprintBüyük strconv.Atoiolasılıkla fmtzaten içe aktardığınız için baytları tasarruf etme olasılığı yüksektir .
EMBLEM

@EMBLEM strconvGolf kodunun normal kodda ne olacağını göstermek için orada olduğumu düşünüyorum .
Benny Jobigan

2

Go derleyicisi önceden tanımlanmış printve printlnfmt almayı gerektirmeyen işlevler, bunun yerine.

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

Bunu yazabilirsin.

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

Bunun STDERR'ye çıktığını unutmayın.


1

For range döngüsünde birçok şey isteğe bağlıdır.

Standart versiyon:

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

Eğer i, vönceden tanımlanmış ve üzerine yazılabilir:

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

Değer umursamıyorsanız:

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

Değer umursamıyorsanız ve izaten tanımlanmışsa:

for i=range a{
// Do stuff
}

Endeks veya değeri umursamıyorsanız:

for range a{
// Do stuff
}

Sonsuz bir döngü istiyorsanız:

for{
// Do stuff
}

1

Yeni satır içeren bir dizgeye mi ihtiyacınız var? Yazmayın \n, backquotes ile ham dize oluşturmak ve içine bir edebi yeni satır koydu.

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

0

Herhangi bir sayıda açılış parantezini bir satıra koyabilirsiniz, ancak açılış parantezleri içeren bir hat en fazla bir kapanış parantezi içerebilir.

Doğru:

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

Ayrıca doğru:

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

Ayrıca doğru:

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

Yanlış:

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

0

Git bit işlemleri için farklı operatör önceliği vardır <<, >>, &vb genellikle daha düşük önceliğe sahip +ve -çoğu dilde, ama git de onlar aynı önceliğe sahiptir *ve /.

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

Bu, bazı parantezleri kurtarmak için kullanılabilir.

Çoğu dil:

(a&b)*c

Gitmek:

a&b*c

0

Tek harfli değişkenlere uzun kitaplık işlev adları atayarak Go'nun birinci sınıf işlevlerinden tam olarak yararlanın.

import."strings"
r:=Replace
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.