Go言語の学習目的で簡単なRESTful APIを実装した。無知識の状態からのスタートであったが、学習・実装の過程や、理解に役に立ったドキュメントを紹介する。
(実装したRESTful API サンプルプロジェクト)
データ永続化や細かいエラー処理には対応していないざっくり実装ではあるが、GitHubにソースコードを載せている。
Go言語の基本を理解する
Go言語のGitHub Wikiに良質なドキュメントが紹介されている。
その他では以下のドキュメントが役に立った。
開発環境を構築する (Windows)
1つの開発環境で複数のGo言語のバージョンを簡単に切り替えられるようにするツールとしてはgoenvもしくはgvmが人気がある。(参考)
残念ながらどちらもChocolateyのパッケージは存在しないため、素直にgolangパッケージをインストールする。
choco install golang
IDEにはVisual Code Studioを利用する。Go言語の公式プラグイン(golang.go)をインストールすれば、コードナビゲーション・補完やビルド・デバッグなど一通りの必要な機能が利用できる。
調べたこと(参考になったドキュメント)
プロジェクトの構成
Google検索から入ると「GOPATHをどうのこうの…」といった記事が多く引っかかるが、Go 1.16ではGo Moduleが推奨となったため、難しいことは考えなくてOKとのこと。
参考:https://zenn.dev/nobonobo/articles/4fb018a24f9ee9
パッケージや変数名の命名規則
- パッケージ名は小文字で1単語。ディレクトリのベース名と合わせる。例:
bytes
- GetterはGetなしのフィールド名、SetterはSet+フィールド名。例:
Name
,SetName
- 1メソッドしか持たないインターフェースはメソッド名+erとする。例:
Reader
- 複数単語は
MixedCaps
もしくはmixedCaps
とする。
mapの使い方
myMap := map[string]int{"a": 1, "b": 2}
fmt.Print(myMap["a"])
ユニークな識別子を生成する
人気どころのライブラリがGenerating good unique ids in Goで紹介されている。今回はrx/xidを使うこととした。
RESTful APIを実装するためのライブラリ
ルーティングやパスパラメータの処理用ライブラリとしてはgorilla/muxもしくはgin-gonic/ginが人気のようである。(参考)
今回はえいやでgorilla/mux](gorilla/mux)を使うことに決めた。以下ではgorilla/muxに関するTipsを記載する。
Subrouterを使ってルーティング処理を分割する
mux.Router.PathPrefix("xxx").Subrouter()
でSubrouterを生成して、各パッケージでルーティング設定を記述すればよい。
共通処理をMiddlewareとして括りだす
レスポンスヘッダの設定やログ出力など全てのAPIで共通化する処理はMiddlewareとして実装すればよい。特定のリソースのみの共通処理の場合いはSubrouterに対してMiddlewareを設定すればよい。
実装例:app.go
Trailing Slashありなしを同列に扱う
gorilla/muxでのTrailing Slashあり・なしの扱いは、301でのリダイレクトもしくは別のルートとして扱う、のどちらか(StrictSlash)しかできない。それならとMiddlewareを作って自力でTrailing Slashを除去しようとすると、gorilla/muxのMiddlewareはルーティング成功時にしか発火しない。ということで、net/httpの方のMiddlewareとして定義することとなる。
実装例:app.go
参考
- https://www.husainalshehhi.com/blog/gorilla-mux-trailing-slashes/
- https://github.com/matrix-org/dendrite/issues/613
積み残し(今後やること)
- データベース(RDBMS, NoSQL)を利用したデータ永続化(O/R Mapper)
- リクエスト・レスポンスボディのシリアライズ・デシリアライズの共通化
- エラー処理をきちんと書く(エラー処理の共通化)
- ポインタレシーバやインターフェースを利用して、オブジェクト指向っぽい実装にする