プログラマー VTuber 衣亥栖ティオのちょっとした話

Youtubeに投稿したプログラミング学習動画の補足説明をするためのブログです。

プログラマーへの道 #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