Які загальні поради щодо гольфу в Go? Я новачок у Code Golfing і шукаю ідеї, які можна застосувати для кодування проблем із гольфом взагалі, які принаймні дещо характерні для Go.
Будь ласка, дотримуйтесь однієї поради на відповідь.
Які загальні поради щодо гольфу в Go? Я новачок у Code Golfing і шукаю ідеї, які можна застосувати для кодування проблем із гольфом взагалі, які принаймні дещо характерні для Go.
Будь ласка, дотримуйтесь однієї поради на відповідь.
Відповіді:
Натхненний відповіддю @ EMBLEM тут .
Ви можете розмістити функції пакету в глобальній області імен, коли ви імпортуєте їх так:
package main
import ."fmt"
func main() {
Printf("Hello World!")
}
Ви можете називати пакети все, що вам подобається, коли ви імпортуєте їх.
package main
import f "fmt"
func main() {
f.Printf("Hello World\n")
}
Про це дізналися тут .
import ."fmt"
і тоді, Println
і решта функцій fmt
's в глобальному просторі імен. Крім того, вам не потрібні крапки з комою. Ніколи, якщо у вас є кілька заяв на рядку
Декларування декількох змінних:
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
вже імпортували
strconv
там було просто показати, який би був код гольфу у звичайному коді.
Компілятор Go заздалегідь визначив print
println
функції та функції, які не потребують імпорту fmt, тому замість цього.
package main
import."fmt"
func main(){Printf(`Hello World
`)}
Ви можете це написати.
package main
func main(){print(`Hello World
`)}
Зауважте, що це виводить на STDERR.
Багато що в циклі діапазону не є обов'язковим.
Стандартна версія:
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
}
Потрібна рядок, щоб містити новий рядок? Не пишіть \n
, створюйте необроблений рядок із зворотними цитатами і вкладайте в нього буквальний новий рядок.
s:="\n" // 7 bytes
s:=`
` // 6 bytes
Ви можете поставити будь-яку кількість відкриваючих дужок на одну лінію, але рядок, що містить розкривні дужки, може містити щонайменше одну фіксуючу дужку.
Правильно:
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}}
}
Go має свої пріоритети оператора для бітових операцій, <<
, >>
, &
і т.д. , як правило , мають більш низький пріоритет , ніж +
та -
в більшості мов, але в Go вони мають однаковий пріоритет , як *
і /
.
Precedence Operator
5 * / % << >> & &^
4 + - | ^
3 == != < <= > >=
2 &&
1 ||
Це можна використати для збереження деяких дужок.
Більшість мов:
(a&b)*c
Перейти:
a&b*c
Використовуйте повноцінні функції першого класу Go, призначивши довгі імена функцій бібліотеки однобуквенним змінним.
import."strings"
r:=Replace
Go
тег, але тоді, чи Go навіть тут використовується для гри в гольф?