Kiat Golf di Go

25

Tips umum apa yang Anda miliki untuk bermain golf di Go? Saya baru mengenal Code Golfing dan mencari ide yang dapat diterapkan pada masalah kode golf secara umum yang setidaknya agak spesifik untuk Go.

Harap simpan satu tip per jawaban.

Sheharyar
sumber
3
Kami mungkin ingin membuat Gotag, tetapi kemudian, apakah Go bahkan digunakan untuk bermain golf di sini?
Pengoptimal
@Optimizer yang dulu
cat
3
Harus mengganti nama judul menjadi "Tips untuk Go-lfing"
Uriel

Jawaban:

12

Terinspirasi oleh jawaban @ EMBLEM di sini .

Anda bisa meletakkan fungsi paket di namespace global saat Anda mengimpornya seperti:

package main

import ."fmt"

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

Anda dapat memberi nama paket apa pun yang Anda suka saat mengimpornya.

package main

import f "fmt"

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

Pelajari ini di sini .

LAMBANG
sumber
3
Anda juga dapat melakukan import ."fmt"dan kemudian Printlndan sisanya dari fmtfungsi 's berada di namespace global. Anda juga tidak perlu titik koma. Pernah, kecuali jika Anda memiliki beberapa pernyataan pada satu baris
cat
Perhatikan bahwa di Golang, kawat gigi harus berada di jalur yang sama, karena penyisipan titik koma otomatis. Info lebih lanjut: golang.org/doc/faq#semicolons .
kucing
7

Nilai pengembalian yang dinamai dapat menyimpan beberapa byte. Sebagai contoh:

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

Anda dapat menyimpan 3 byte dengan

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

Ini lebih berguna jika Anda perlu mendeklarasikan beberapa variabel di awal fungsi Anda.

LAMBANG
sumber
7

Jika Anda perlu membandingkan banyak nilai yang berbeda dengan yang tunggal, mungkin lebih hemat ruang untuk menggunakan a switchdengan satu case.

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

Mendeklarasikan Banyak Variabel:

i,s:=0,""

var(i int;s string)

Int From String Conversion: (terbatas tetapi terkadang bermanfaat)

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

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

Dan sebaliknya

s:=string(9+48)

s:=strconv.Itoa(9)
Justin Powell
sumber
fmt.Sprintkemungkinan akan menghemat byte strconv.Atoi, karena Anda kemungkinan fmtsudah mengimpor .
EMBLEM
@ ANGGOTA Saya pikir strconvada di sana hanya untuk menunjukkan apa kode golf akan menjadi kode normal.
Benny Jobigan
2

Go compiler telah ditentukan sebelumnya printdan printlnfungsi yang tidak memerlukan impor fmt, jadi alih-alih ini.

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

Anda bisa menulis ini.

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

Perhatikan bahwa ini output ke STDERR.

Konrad Borowski
sumber
1

Banyak hal dalam loop rentang adalah opsional.

Versi standar:

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

Jika i, vsudah ditentukan dan dapat ditimpa:

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

Jika Anda tidak peduli dengan nilai:

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

Jika Anda tidak peduli dengan nilai dan isudah didefinisikan:

for i=range a{
// Do stuff
}

Jika Anda tidak peduli dengan indeks atau nilai:

for range a{
// Do stuff
}

Jika Anda ingin loop tak terbatas:

for{
// Do stuff
}
JayXon
sumber
1

Perlu string untuk memuat baris baru? Jangan menulis \n, buat string mentah dengan backquote dan tuliskan baris baru literal di dalamnya.

s:="\n" // 7 bytes
s:=`
` // 6 bytes
Ungu P
sumber
0

Anda dapat menempatkan sejumlah kawat gigi pembuka pada satu baris, tetapi garis yang berisi kawat gigi pembuka dapat memuat paling banyak satu kawat gigi penutup.

Benar:

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

Benar juga:

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

Benar juga:

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

Salah:

func main() {
    if true{for{break}}
}
LAMBANG
sumber
0

Go memiliki prioritas operator yang berbeda untuk operasi bit, <<, >>, &, dll biasanya memiliki didahulukan lebih rendah dari +dan -dalam kebanyakan bahasa, tetapi di mana mereka memiliki hak yang sama seperti *dan /.

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

Ini dapat digunakan untuk menyimpan beberapa tanda kurung.

Sebagian besar bahasa:

(a&b)*c

Pergi:

a&b*c
JayXon
sumber
0

Manfaatkan sepenuhnya fungsi kelas satu Go dengan menetapkan nama fungsi pustaka yang panjang ke variabel satu huruf.

import."strings"
r:=Replace
Ungu P
sumber