なんか作りたい
A Tour of Goを一通りなぞったので, なんか作りたくなった.
やったこと
Goの練習として, コマンドラインで動くかんたんなサイコロを作ってみた.
動作のイメージ :
$ dice # 1~6の範囲でランダムに生成された整数を1つ出力
3
$ dice -f 10 # -fオプションでサイコロの最大値を変更
9
$ dice -d 2 # -dオプションで振るサイコロの数を変更
5 4
$ dice -f 10 -d 2 # -fオプションと-dオプションの併用も可能
6 9
つかうもの
- MacBook Pro (Retina, 15-inch, Mid 2015)
- macOS Mojave 10.14
- Go
- go version go1.12.9 darwin/amd64
- インストール手順
手順
- dice.goの作成
- dice.goをインストール
dice.goの作成
とりあえず標準パッケージを使って作ってみた.
$ mkdir -p $GOPATH/src/github.com/uzimihsr/dice
$ cd $GOPATH/src/github.com/uzimihsr/dice
$ vim dice.go
dice.go
package main
import (
"flag"
"fmt"
"math/rand"
"time"
)
func main() {
// コマンドラインオプションで与える値の変数定義
var (
faces uint
dices uint
)
// コマンドラインオプションの設定
flag.UintVar(&faces, "f", 6, "The number of dice faces")
flag.UintVar(&dices, "d", 1, "The number of dices to throw")
flag.Parse()
// サイコロを振り, 出目を出力
rand.Seed(time.Now().UnixNano())
for i := 0; i < int(dices); i++ {
fmt.Printf("%d ", (rand.Intn(int(faces)) + 1))
}
fmt.Println()
}
Goでコマンドラインツールを作る場合にはurfave/cliとかcobraが良いらしいんだけど,
今回はそこまで高機能なものはつくらないので標準パッケージflagを使ってオプションの処理をした.
サイコロの処理(乱数の生成)にはこちらも標準のmath/randパッケージを使った.
そのまま使うと乱数のSeedが1で固定され, 毎回同じ値が生成されてしまうのでtimeパッケージで呼び出したUnix時間を乱数Seedとして使うようにした.
dice.goをインストール
go install
を使ってdice.goの実行ファイルを$GOPATH/bin
にインストールする.
$ cd $GOPATH/src/github.com/uzimihsr/dice
$ go install
$ which dice
{$GOPATH}/bin/dice
$ dice -f 12 -d 6
1 6 8 9 11 3
いい感じ.
つくったやつはここ.