Home > Archives > 2009年12月22日

2009年12月22日

Go-lf!

ということで,せっかくGoを勉強したのでゴルフ場で(頭と指の)運動をしてみた.

大人気なく問題を解きまくってGoで解いた人ランキング一位になった.

以下,ショートコーディングのための技術.

  • Raw String Literal を使うべし. 特に,改行にエスケープがいらないため,
    s:="hoge\nhuga"
    s:=`hoge
    huga`
    でいいので1Bの短縮.他にもバイナリデータを文字列として埋め込んでしまうという…

  • 外部パッケージをローカルの名前空間に展開すべし.

    インポート時の束縛名にドットを使うと,他パッケージの関数などをローカルの名前空間に展開出来る.なので,
    import"fmt"func m(){fmt.Print(“c")}
    import."fmt"func m(){Print(“c")}
    に短縮できる.複数のパッケージをローカルに展開できるが,同一名があると衝突するので,解決に短い名前を付ける必要がある.ついでにインポートのファイル名の後には空白がいらないという…

  • 関数変数を使うべし.

    関数も変数に入れられる.なので,
    x:=Sprintf("%c",c);y:=Sprintf("%c",d);
    f=Sprintf;x:=f("%c",c);y:=f("%c",d);
    に短縮できる.でもprintlnとかの特別な関数は束縛出来ないという…

  • 依存の無い(初期値)代入はまとめるべし.

    変数への値代入は,型に関係なくカンマでつないで一気に書ける.なので,
    x:=1;y:="str";z:=2
    x,y,z:=1,"str",2
    に短縮できる.でも,複数の値を返す式が右辺にあると怒られるという… (複数値のコンテキストのネストが出来ないらしい) ついでに,複数値の代入文は右辺が全て評価されてから左辺へと代入されるので,
    t:=x;x=y;y=t
    変数のスワップなどは複数値の代入を使って
    x,y=y,x
    のように短く書ける.

  • Sliceは上手に作るべし.

    Sliceの生成にはmakeを使う方法とcomposite literalを使う方法がある.なので,小さなsliceをつくるなら
    b:=make([]byte,1)
    でなく
    b:=[]byte{1}
    にする.また,大きなsliceも
    b:=make([]byte,10000)
    でなく
    b:=make([]byte,1e4)
    にする.

そして微妙な謎は,手元のコンパイラではプログラムの最後に改行が必須だったりブロックの閉じカッコの直後に文を書くにはセミコロンが間に必須だったりするのだけど… ゴルフ場だと必要ないらしい.ちょっと手元でプログラム書くときに気を使う.
それにしても全体的に短く出来ない言語だなぁという感想.入出力が一苦労だったりするし.もう少し入力を簡単に取れると良いのだけど… 現状では必ず[]byteを介さねばならないのでメンド臭い&長すぎる.

Home > Archives > 2009年12月22日

Search
Feeds

Page Top