Поради щодо гольфу в Го


25

Які загальні поради щодо гольфу в Go? Я новачок у Code Golfing і шукаю ідеї, які можна застосувати для кодування проблем із гольфом взагалі, які принаймні дещо характерні для Go.

Будь ласка, дотримуйтесь однієї поради на відповідь.


3
Ми можемо захотіти створити Goтег, але тоді, чи Go навіть тут використовується для гри в гольф?
Оптимізатор

@Optimizer я використовував для
кіт

3
Потрібно перейменувати назву на "Поради щодо Go-lfing"
Уріель,

Відповіді:


12

Натхненний відповіддю @ EMBLEM тут .

Ви можете розмістити функції пакету в глобальній області імен, коли ви імпортуєте їх так:

package main

import ."fmt"

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

9

Ви можете називати пакети все, що вам подобається, коли ви імпортуєте їх.

package main

import f "fmt"

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

Про це дізналися тут .


3
Ви також можете виконувати import ."fmt"і тоді, Printlnі решта функцій fmt's в глобальному просторі імен. Крім того, вам не потрібні крапки з комою. Ніколи, якщо у вас є кілька заяв на рядку
кіт

Зауважте, що в Golang дужки повинні йти по одній лінії через автоматичне вставлення крапки з комою. Більше інформації: golang.org/doc/faq#semicolons .
кіт

7

Названі значення повернення можуть зберегти кілька байт. Наприклад:

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

Ви можете зберегти 3 байти за допомогою

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

Це корисніше, якщо вам потрібно оголосити кілька змінних на початку своєї функції.


7

Якщо вам потрібно порівняти багато різних значень з одним, можливо, використовувати більш просторе використання switchз одним випадком.

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

2

Декларування декількох змінних:

i,s:=0,""

var(i int;s string)

Int з конвертації рядків: (обмежено, але іноді корисно)

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

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

І навпаки

s:=string(9+48)

s:=strconv.Itoa(9)

fmt.Sprintймовірно, буде збережено байти більше strconv.Atoi, тому що ви ймовірно fmtвже імпортували
ЕМБЛЕМ

@EMBLEM Я думаю, що strconvтам було просто показати, який би був код гольфу у звичайному коді.
Бенні Джобіган

2

Компілятор Go заздалегідь визначив printprintln функції та функції, які не потребують імпорту fmt, тому замість цього.

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

Ви можете це написати.

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

Зауважте, що це виводить на STDERR.


1

Багато що в циклі діапазону не є обов'язковим.

Стандартна версія:

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

Якщо i, vвже визначено і може бути перезаписано:

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

Якщо ви не переймаєтесь цінністю:

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

Якщо ви не переймаєтесь цінністю та iїї вже визначено:

for i=range a{
// Do stuff
}

Якщо вам не байдуже індекс чи значення:

for range a{
// Do stuff
}

Якщо ви хочете нескінченний цикл:

for{
// Do stuff
}

1

Потрібна рядок, щоб містити новий рядок? Не пишіть \n, створюйте необроблений рядок із зворотними цитатами і вкладайте в нього буквальний новий рядок.

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

0

Ви можете поставити будь-яку кількість відкриваючих дужок на одну лінію, але рядок, що містить розкривні дужки, може містити щонайменше одну фіксуючу дужку.

Правильно:

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

Також правильно:

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

Також правильно:

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

Неправильно:

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

0

Go має свої пріоритети оператора для бітових операцій, <<, >>, &і т.д. , як правило , мають більш низький пріоритет , ніж +та -в більшості мов, але в Go вони мають однаковий пріоритет , як *і /.

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

Це можна використати для збереження деяких дужок.

Більшість мов:

(a&b)*c

Перейти:

a&b*c

0

Використовуйте повноцінні функції першого класу Go, призначивши довгі імена функцій бібліотеки однобуквенним змінним.

import."strings"
r:=Replace
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.