最近よくGo言語の評判を耳にするようになりました。ちょっと勉強してみようと思いまして、コマンドラインツールを作ってみました。
リズミカルに「ほずみ」と出力するだけの、なんの役にもたたないツールです。(「ほずみ」以外にも色々出力できます。) Go言語はクロスコンパイル環境の構築が容易で、様々な環境で動くバイナリファイルが簡単に作成できます。以下のようなスクリプトを作成すれば、一気に5環境のバイナリファイルを作成できます。
GOOS=linux GOARCH=386 go build -o tools/linux/i386/hozumi hozumi.go
GOOS=linux GOARCH=amd64 go build -o tools/linux/amd64/hozumi hozumi.go
GOOS=windows GOARCH=386 go build -o tools/windows/i386/hozumi.exe hozumi.go
GOOS=windows GOARCH=amd64 go build -o tools/windows/amd64/hozumi.exe hozumi.go
GOOS=darwin GOARCH=amd64 go build -o tools/darwin/hozumi hozumi.go
Go言語はサイトの情報が充実していますね。日本語の翻訳も進んでいて素晴らしいです。基本的にサイトを見れば、ひととおり習得できそうです。基本的な構文はサイトを見れば充分かと。
作成したツールは以下を使っています。
コマンドラインツールなのでオプション指定を可能にしたいのですが、標準パッケージが存在します。
flag.BoolVar(&help, “h”, false, “display help”) flag.BoolVar(&help, “help”, false, “display help”)
上のように記述すれば、変数helpには-h(or –help)が指定されていれば、”true”、指定されていなければ”false”が入ります。
またflag.Usage
に関数を代入すれば、誤ったオプションを指定した場合に代入した関数を実行することができます。ヘルプ表示をすることも容易にできます。”First-Class Functions(第1級関数)”ってやつですね。
リズミカルな出力のために、sleepをさせたいです。Sleep関数はtimeパッケージにあります。
Go言語にはクラスの概念は無いようです。C言語のような構造体が定義できます。
type HozumiWriter struct {
contents []string
intervalDisplayRow time.Duration
intervalDisplayOneLetter time.Duration
intervalDisplayCool time.Duration
cool bool
dashboard []string
}
構造体に振る舞いは定義できます。writeメソッドから、displayContentsメソッドなどを呼んでいます。-cオプションが付いている場合は、"Coooooooooooooooooooooool"
と叫びます。(2014/02/13現在)
func (writer *HozumiWriter) write() {
for {
writer.displayContents()
if writer.cool {
writer.displayCool()
}
}
}
「LL言語ほど柔軟な記述はできませんが、C言語よりはカジュアルに使えそう」というのが私のGo言語に対する印象です。
実は1点このツールで実装したいけれどできていないものがありまして、-p --parallel
オプションです。Go言語をさわる前によく耳にしていたのがゴルーチンです。並列処理の扱いが得意であると。
並列的にパラメータで指定した文字列を出力させたり、”Cooooooooooooooooooooooooooooooooool”と叫ばせるのが当面の目標です。