プログラマーへの道 #141 の補足説明
こんにちは、プログラマーVTuberの衣亥栖ティオです。
この記事はYouTubeに投稿した動画の補足ブログです。
投稿した動画
今回は以下の動画の補足説明をします。
GitHub のURL
私のGitHubは以下です。
https://github.com/tio-iis
Gist のURL
私のGitst(メモ書きみたいなもの)のURLは以下です。
https://gist.github.com/tio-iis
今回の動画で実装したソースコード
今回の実装は以下です。
https://github.com/tio-iis/memo-server/pull/54/files
現時点でのソースコードは以下です。
https://github.com/tio-iis/memo-server/tree/1fb393027f70eb77721d036267bcec77bf6e224c
補足内容
バリデーション時に警告ログを出力している件について
前回のブログでも言及した通り、警告ログの出力を修正しました。
https://github.com/tio-iis/memo-server/pull/54/files#diff-2873f79a86c0d8b3335cd7731b0ecf7dd4301eb19a82ef7a1cba7589b5252261R132
同じミスをしないように以下のようにコメントを残しています。
https://github.com/tio-iis/memo-server/pull/54/files#diff-2873f79a86c0d8b3335cd7731b0ecf7dd4301eb19a82ef7a1cba7589b5252261R222-R223
fmt.Sprintf() によるエラーメッセージの出力について
動画では以下のエラーメッセージ出力が上手くいきませんでした。
https://github.com/tio-iis/memo-server/pull/54/files#diff-2873f79a86c0d8b3335cd7731b0ecf7dd4301eb19a82ef7a1cba7589b5252261L221
具体的には以下のようなエラーメッセージが出力されてしまいました。 本当は error の値にエラーメッセージを出力したかったのですが、[0xc0000b82a0] という値になっています。 これはスライスのポインタです。
{"date_time":"2022-06-19 05:15:22","level":"WARNING","kind":"log","message":"invalid memo, error = [0xc0000b82a0]"}
エラーメッセージを出力するにはどうすればいいかというと、方法としては3つあります。
1つ目は動画内でも実施した通り、for でスライスの値を取り出すという方法です。これはシンプルな方法ですが、少し面倒ですね。
2つ目はスライスにしている構造体をポインタではなく、値にするという方法です。これは *ErrorMessage を ErrorMessage に変更するということです。 アスタリスクをなくすことで、ErrorMessageのポインタではなく、ErrorMessageの値を保持するスライスに変更することになります。 これは一見良さそうですが、動画の方針として"構造体はポインタで扱う"というものがあるので、ここだけ例外にすると混乱しそうだったので、避けました。 しかし、そもそも"エラーメッセージを出力するために構造体をポインタで扱わないようにする"というのは実装の方針としてはおかしいことなので、 どちらにしろポインタを値に変更するというのは却下しました。
3つ目はスライスにStringerインターフェースを実装するという方法です。実はこれがエラーメッセージを表示させるための正攻法になります。 しかし、現時点でインターフェースやStringerという概念を扱っていないので、今回の動画でこれを説明するのは難しかったです。
最終的には"警告ログはバリデーション時に出力する"という方針に気づいたので、 エラーメッセージの表示に悩むことはなくなりましたが、 構造体のポインタのスライスの値を表示するのは、毎回面倒だなーと思ってしまいますね。
参考にしたURLは以下です。
https://stackoverflow.com/questions/24489384/how-to-print-the-values-of-slices