Featured image of post Goでコマンドラインサイコロを作った

Goでコマンドラインサイコロを作った

なんか作りたい

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

つかうもの

手順

  • 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

いい感じ.

つくったやつはここ.

おまけ

スマホをけとばすねこ with エリザベスカラー