gotosocialからnotestockが使えなくて、少し調べてもわからなかった上にnotestockがソースコードを公開しておらず(してないよね?)調査を進めるのが困難そうだったので、自分で作ってみることにした。もとより自分のデータを自分で管理することは重要だと思っていたので、そういう意味もある。
https://github.com/chao7150/activitypublog
使用技術はGo+Echo+MySQL8.0。まあ正直手慣れたRemix+Prismaでやったほうが早いとは思うんだけど、たまには違うことをやったほうがいい。自分でアプリケーションをGoで書くのはこれが初めて。普段一番書いているTypeScriptに比べると、補間、エコシステム、ドキュメント、ビルドの速さが優れている。型システムは劣っている。module/packageが難しく、挙動もベストプラクティスもよくわかっていない。この辺を読んで参考にしている
- https://github.com/golang-standards/project-layout
- https://future-architect.github.io/articles/20201109/
- https://future-architect.github.io/articles/20200528/
また、具体的なGoの書き方の作法はGoToSocialを真似ている。
Goで良いなと思ったのは、timeだ。たとえば
// Go
time.Now().Add(5 * time.Minute)
は間違いなく
// JavaScript
new Date(Date.now() + 5 * 1000 * 60)
よりエレガントだ。
フォーマット文字列も好きだ。大抵は%vでどうにかなるという逃げ道を残しつつ、各データ型の中でも様々な表現を可能にしている。
if err...の洪水については、エラーメッセージを真面目に考える契機になる。すなわち、エラーはerrを通して呼び出し元に順に伝播するわけだが、その過程の各関数の中で徐々に情報を付け加えることができる
if err != nil {
return c.String(http.StatusInternalServerError, fmt.Sprintf("error GET /: %v", err))
}
具体的に何が失敗したのかはerrの中身をそのまま表示しつつ、この階層では GET /
という場所でエラーが起きたという情報を付け加えている。