tnoda78.github.io


Go言語のお勉強 コマンドラインツールを作成する


はじめに

最近よくGo言語の評判を耳にするようになりました。ちょっと勉強してみようと思いまして、コマンドラインツールを作ってみました。

Hozumi Command (ソース)

リズミカルに「ほずみ」と出力するだけの、なんの役にもたたないツールです。(「ほずみ」以外にも色々出力できます。) 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パッケージ

http://golang.jp/pkg/flag

コマンドラインツールなのでオプション指定を可能にしたいのですが、標準パッケージが存在します。

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級関数)”ってやつですね。

timeパッケージ

http://golang.jp/pkg/time

リズミカルな出力のために、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”と叫ばせるのが当面の目標です。