Umi Uyuraのブログ

プログラミング関連の作業ログ

Go言語触ってみた&指定した日付の曜日を表示するツールを作った

2023年プログラミング書き初めがてら、個人的に作りたいツールがあったので、Go言語デビューがてら作ってみました。

dow(指定した日付の曜日を表示するツール)

作ったものは、日付を渡すと、その日付の曜日を表示する、というだけのものです。

https://github.com/umi-uyura/dow

使い方はこんな感じ。

# LANG=ja_JP
$ dow 2023-1-1
日

カレンダーを見れば事足りるものではありますが、Emacsでメール用の文章を書いているときに期限などの日付を入れときに、適当に今日から3日後とか決めると曜日がパッとわからないことがあるので、コマンドがあればEmacsから呼び出して反映できるな、という思いつきから作ってみました。

Linuxのdateコマンドで調べる方法

ちなみに、わざわざコマンドを作らなくても、Linuxdate コマンドで以下のようにすれば表示できます。

$ 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 mainfunc 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上のUbuntuWindowsで確認)

$ go install github.com/umi-uyura/dow@latest

とても簡単。

曜日を日本語表記で出力する

今回のコマンド、基本的には英語で表示しつつ、 LANG 環境変数で日本語などの表記で出力できるようにしようと考えたのですが、どうやらGoとしては標準では日本語リソースを持っておらず、日本語の言語パックを入れていても表示しないようでした。

調べてみたところ、こういった場合は標準の英語出力を文字列置換して対応するのが定石のようです。

Goで日本語曜日を含む日付format - Qiita

実際、今回曜日表記を多言語対応するために利用したライブラリでも、内部実装は同じようなことをしていました。

goodsign/monday

このライブラリのおかげで、40種類の言語での表記に対応できました。

おわり

とりあえずGo言語に取り組むとっかかりができたので、これをベースにしつつ、機能追加やテストの用意、あとはEmacsVSCodeでの開発環境作りなど掘り下げていけたらと思います。