Go言語触ってみた&指定した日付の曜日を表示するツールを作った
2023年プログラミング書き初めがてら、個人的に作りたいツールがあったので、Go言語デビューがてら作ってみました。
dow(指定した日付の曜日を表示するツール)
作ったものは、日付を渡すと、その日付の曜日を表示する、というだけのものです。
https://github.com/umi-uyura/dow
使い方はこんな感じ。
# LANG=ja_JP
$ dow 2023-1-1
日
カレンダーを見れば事足りるものではありますが、Emacsでメール用の文章を書いているときに期限などの日付を入れときに、適当に今日から3日後とか決めると曜日がパッとわからないことがあるので、コマンドがあればEmacsから呼び出して反映できるな、という思いつきから作ってみました。
Linuxのdateコマンドで調べる方法
ちなみに、わざわざコマンドを作らなくても、Linuxの date
コマンドで以下のようにすれば表示できます。
$ date "+%a" -d "2023/1/1" Sun $ LANG=ja_JP.utf8 date "+%a" -d "2023/1/1" 日
まあせっかくテーマができたので、以前から触ってみたかったGoで作ってみようと思った次第です。
やったことのメモ
今回はGo言語の文法などは必要に応じて調べていくことにして、最低限動いて公開するところまでを優先することにして、やったことのメモ。
- プロジェクトの開始
- 処理を実装する
- 開発中に使う主なコマンド
- 配布
開発した環境は以下のようなもの。
プロジェクトの開始
プロジェクトを開始する際には、他の外部モジュールを読み込むための準備として、プロジェクトのディレクトリで go mod init
を実行します。
その際、引数としてmodule pathというものを指定しますが、これはモジュールを識別するためのもので、ソースコードを保存しているリポジトリの場所とするのが一般的とのこと。
今回、プロジェクト名は単純にday of weekから dow
にしようと決めていたので、自分のGitHubリポジトリをベースにしたmodule pathにしました。
$ go mod init github.com/umi-uyura/dow
実行すると、module pathなどが記載されたgo.modというファイルがディレクトリ内に生成されました。
これがあると他の公開されている外部モジュールを go get
コマンドでインストールできるようになります。
module pathは go mod edit
コマンドを使うことで変更することもできるようなので、開発当初は仮で付けておくこともできそう。
$ go mod edit -module github.com/user/a-different-repo
処理を実装する場所
以下はGo公式サイトのGetting Startedに書かれているHello Worldのコードです。
Tutorial: Get started with Go - The Go Programming Language
package main import "fmt" func main() { fmt.Println("Hello, World!") }
この中で必須なのは package main
と func main()
で、main
パッケージにある main()
関数がエントリポイントになるので、その中に処理を実装していきます。
開発中の実行方法
主に以下のコマンドを使って実行や動作確認をしていました。
ソースコードを実行する
$ go run main.go
バイナリを作る(この場合はプロジェクト直下に実行ファイルが生成される)
$ go build
プロジェクトから直接コマンドをインストールする( $GOPATH/bin
に実行ファイルが生成される )
$ go install
インストールしたコマンドを削除する( $GOPATH/bin
から実行ファイルが削除される )
$ go clean -i
配布
実装完了後は、プロジェクト開始時に指定したリポジトリ https://github.com/umi-uyura/dow にソースコードをアップして、以下のように go install
を実行したところ、コマンドがインストールできました。(WSL上のUbuntuとWindowsで確認)
$ go install github.com/umi-uyura/dow@latest
とても簡単。
曜日を日本語表記で出力する
今回のコマンド、基本的には英語で表示しつつ、 LANG
環境変数で日本語などの表記で出力できるようにしようと考えたのですが、どうやらGoとしては標準では日本語リソースを持っておらず、日本語の言語パックを入れていても表示しないようでした。
調べてみたところ、こういった場合は標準の英語出力を文字列置換して対応するのが定石のようです。
実際、今回曜日表記を多言語対応するために利用したライブラリでも、内部実装は同じようなことをしていました。
このライブラリのおかげで、40種類の言語での表記に対応できました。
おわり
とりあえずGo言語に取り組むとっかかりができたので、これをベースにしつつ、機能追加やテストの用意、あとはEmacsやVSCodeでの開発環境作りなど掘り下げていけたらと思います。