LoginSignup
4
10

More than 3 years have passed since last update.

Go言語でRESTful APIを実装する(+Go言語の基本を理解する)

Last updated at Posted at 2021-04-11

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

パッケージや変数名の命名規則

Effective Go - Names

  • パッケージ名は小文字で1単語。ディレクトリのベース名と合わせる。例:bytes
  • GetterはGetなしのフィールド名、SetterはSet+フィールド名。例:Name, SetName
  • 1メソッドしか持たないインターフェースはメソッド名+erとする。例:Reader
  • 複数単語はMixedCapsもしくはmixedCapsとする。

mapの使い方

Go maps in action

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を生成して、各パッケージでルーティング設定を記述すればよい。

実装例:app.gotodo/controller.go

共通処理を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

参考

積み残し(今後やること)

  • データベース(RDBMS, NoSQL)を利用したデータ永続化(O/R Mapper)
  • リクエスト・レスポンスボディのシリアライズ・デシリアライズの共通化
  • エラー処理をきちんと書く(エラー処理の共通化)
  • ポインタレシーバやインターフェースを利用して、オブジェクト指向っぽい実装にする
4
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
10