学んだこと
Golangの標準ライブラリflagを使って、コマンドライン引数を受け取る方法
flagの使いかた
flag.Boolの使い方に少し戸惑った。ブール型のフラグを定義する。コマンドラインでは、変数名だけの時はtrueになり、別途明示的に、=false,=trueと記述できる。文字列や数値はパースエラーとなった。
func main(){
hoge := flag.Bool("hoge", false, "hoge argument")
fuga := flag.Bool("fuga", false, "fuga argument")
flag.Parse()
fmt.Println("hoge3",*add)
fmt.Println("hoge4",*list)
}
go run . -hoge=true -fuga
hoge true
fuga true
また、flag.Parse()は一度だけ呼び出す必要がある(自分は2回呼び出そうとして、エラーになりました)
deferの使いかた
deferはGoの制御構文の一つで、関数の実行を遅延するために使う。deferを使って指定した関数は、現在の関数が終了する直前に実行される。
jsonタグの使いかた
jsonタグは、Goの構造体フィールドに付けるタグで、JSONのエンコードやデコード時に使用されるキー名を指定するために使う。
json:"-"
と指定すると、そのフィールドがJSONエンコード・デコードから除外される。
json:hoge,omitemmpty
と指定すると、そのフィールドの値がゼロ値(空文字列、0,false,nilなど)の場合、そのフィールドをJSONに含めない。
エラーの中身を判定する方法
GOを勉強していると、以下のような記述をよく目にする。
if err != nil{
// 具体的な処理
}
もっと詳細にエラーハンドリングをしたいとき、osパッケージに以下のようなものがある。
// エラーが「ファイルやディレクトリが存在しない」ことを示すかどうか
os.IsNotExist(err)
// エラーが「許可されていない操作」や「アクセス権限がない」ことを示すかどうか
os.IsPermission(err)
必要に応じて、適切にエラーハンドリングをしていきたい。
また、fmt.Errorfでエラーメッセージを出力しようとしたときに、メッセージの末尾にピリオドを入れたら、警告が表示された。どうやら、Goのスタイルガイドでは、エラーメッセージの文字列は句読点で終わらないようにすることが推奨されているらしい。
スライスから要素を削除する方法
追加するときはappend()メソッドを使えばいいが、削除するときはremove()のようなメソッドはないらしい。
今回作成したコード
https://codesandbox.io/p/sandbox/github/codesandbox/sandbox-templates/tree/main/go