Goでのゴルフのヒント


25

Goでゴルフをするための一般的なヒントは何ですか?私はCode Golfingを初めて使い、少なくともGoに特有のゴルフ問題全般に適用できるアイデアを探しています。

回答ごとに1つのヒントを保管してください。


3
Goタグを作成することもできますが、Goはここでゴルフに使用されていますか?
オプティマイザー14年

以前使用していた
cat

3
「ゴー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の機能は、グローバル名前空間にあります。また、セミコロンは必要ありません。これまで、あなたがライン上で複数のステートメントがない限り

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 From String Conversion:(制限されているが、時には役立つ)

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

ゴーコンパイラは、事前に定義しているprintprintlnFMTをインポートする必要がない機能なので、これに代えて。

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

これを書くことができます。

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

これはSTDERRに出力されることに注意してください。


1

for範囲ループの多くのものはオプションです。

標準バージョン:

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

場合はivすでに定義されていると上書きすることができます。

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

1行に任意の数の開始中括弧を配置できますが、開始中括弧を含む行には、最大1つの終了中括弧を含めることができます。

正しい:

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はビット演算のためのさまざまな演算子の優先順位を持っている、<<>>&、などが通常よりも低い優先順位を持っている+し、-ほとんどの言語ではなく、移動中に、彼らは同じ優先順位を持つ*/

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

これは、いくつかの括弧を保存するために使用できます。

ほとんどの言語:

(a&b)*c

行く:

a&b*c

0

長いライブラリ関数名を1文字の変数に割り当てることにより、Goのファーストクラス関数を最大限に活用します。

import."strings"
r:=Replace
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.