golangのお勉強10+goa


## goaをとりあえず使う

### 初感

agoでの生成はほとんどできなかったけど。。
ちょーベンリー！
はやいー！
まだ、おぼえることはありそうだけども。

公式、使い方を深掘りしたいところ。

goagen：goa のツール · goa :: Design-first API Generation
https://goa.design/ja/implement/goagen/

使って見た生成ツール。

tchssk/ago: A tool to generate a design definition of goa from a swagger definition
https://github.com/tchssk/ago

### ここの記事を順番に見ていくのもいいかも。

goa でデザイン・ファーストをシュッとする - Qiita
http://qiita.com/ikawaha/items/6638ee8b6978aef50d65#_reference-1585e09173db4b55de96

## 記事を順番に見ていく

goa のインストールと実行 - 押してダメならふて寝しろ
http://ikawaha.hateblo.jp/entry/2016/09/12/164728

```shell
$ goagen bootstrap -d cellar/design
$ go run *.go
$ curl -XGET localhost:8080/bottles/1
$ go run tool/cellar-cli/main.go show bottle bottles/1
```

> goagen はリポジトリの goagen 以下の gen_* というフォルダがサブコマンドに対応していて，実行するたびにプラグイン的にここの下をビルドして利用しているので，goagen をインストールしたからといってリポジトリを消してしまうとうまく動かなくなってしまうので注意です．

最初は読み流してしまったけど、そういう構造になってるのね。。ふーむ。

### goa の API デザインの書き方 前編 (API と MediaType) - 押してダメならふて寝しろ
http://ikawaha.hateblo.jp/entry/2016/09/13/215006

わかりやすかった。

公式のDSLガイド

· goa :: Design-first API Generation
https://goa.design/reference/goa/design/apidsl/

### goa の API デザインの書き方 後編 (Resource と Payload) - 押してダメならふて寝しろ
http://ikawaha.hateblo.jp/entry/2016/09/14/194237

> コラム：パラメータが必須要素であるときとそうでないときの扱いの違い

わかりやすかった。
コラムの必須項目とオプションの時の使い方についての記述が参考になる。

> POST でも PATCH メソッドでもアクセスできる endpoint を指定することも出来ます

なるほど。

### goa tips : Attribute と Param と Member は同じもの - 押してダメならふて寝しろ
http://ikawaha.hateblo.jp/entry/2016/09/14/200606

> Attribute も Param も Member も，すべて Attribute のエイリアス関数で同じものなんです．というお話

なるほどー。
ほんとだ。

```
// Member can be used in: Payload
//
// Member is an alias of Attribute.
func Member(name string, args ...interface{}) {
	Attribute(name, args...)
}

// Param can be used in: Params
//
// Param is an alias of Attribute.
func Param(name string, args ...interface{}) {
	Attribute(name, args...)
}
```

複雑な型定義もできて、Typeを使う時にはすこし注意。

`HashOf(Any)`みたいなのもいけるのかな。。

> なるべく Example で指定するか，明示的に NoExample 関数を指定してサンプルを作らないようにするかした方がいい

### goa tips : Type と MediaType を使い分けよう - 押してダメならふて寝しろ
http://ikawaha.hateblo.jp/entry/2016/09/15/235913

なるほど、残念。

> Payload の要素に MediaType を利用することは可能ですが，MediaType で指定したいと思っているデータ形式と同等のものを Type で定義してそれで指定するのが無難でしょう．Payload の要素に MediaType を使って，これに Example を適用するとうまく設定できないケースがあるため（バグ？）その観点からも避けた方がよさそうです

MediaTypeのレスポンスデータにはCollectionOfをつかって、他はArrayOfって感じかな。。

> CollectionOf と ArrayOf の使い分け

### goa tips : swagger-ui を使って手っ取り早く API を試す - 押してダメならふて寝しろ
http://ikawaha.hateblo.jp/entry/2016/09/21/172336

swagger uiもapiサーバーでサービスにしてしまうと。なるほど。
工夫すればもう少し便利になるかもな。。

（後の記事で改善されていた。）

### goa の controller を実装する - 押してダメならふて寝しろ
http://ikawaha.hateblo.jp/entry/2016/10/11/234941

コントローラーだけ編集して、他は編集しないという思想でgoaがつくられている。よさげ。
もし何かあったら、、おれおれgoaにしちゃうのかプルリクを投げるのか。。まあいいや。

コントローラーのActionを生成するのは`goagen main`にforceをつけてもいいし、手動でもあまり手間ではない。なるほど。

> 実装に必要なパラメータはすべてコンテキスト ctx で運ばれてきます

あれ、ちょっと、、payloadってなんだっけ。。
エンドポイントでパラメータを組み合わせてjsonにしてコントローラーへ渡す機構ってことかしら。

> この Payload に含まれる値も，すでにバリデーションを通過してきた値なので，デザインで設定したバリデーションはコントローラ内でチェックする必要はありません．また，Payload はポインタになっていますが，nil にはならないので，nil チェックする必要はないです． 注：Payload が nil になる可能性があるのは，Payload をデザインで OptionalPayload 関数で設定した場合だけ．

なるほどー。このへん大事だなー。

exampleも雛形を埋めればいいと。なるほど。

> ちなみに，コントローラーの返値を何か適当な Error 型のエラーで返すと，goa 的には InternalError として扱います．
> ...
> このようにエラーが漏れてしまっても，InternalServerError になるので問題はないのですが，よりお行儀よく処理するには， goa.ErrorResponse に詰め直して返してやるのがいいでしょう．

なるほどー。勉強になる。

> ID に設定した middleware.ContextRwquestID(ctx) は，main.go でミドルウエアとして middleware.RequestID が設定されていれば(特に設定してなければデフォルトで設定されるはず

なるほど。ミドルウェアってのが設定されてるのか。。

> さて，コントローラで DB を引きたい場合など，アプリケーションで設定を引き回したい場合にはどうしたらいいでしょうか？ といっても，どうするのが正解なのかよくわからんですが，いまのところ

> ミドルウエアを自分で用意してコンテキストで引き渡す方法
コントローラーに引き渡したい要素を追加して，main 関数で，コントローラーをマウントする際に一緒に設定する方法
の2つがあるかなと思ってます．

* コンテキストだとmain.goだけで済む
* コントローラーだとコントローラーを作るたびに修正

コンテキストの方が良さそうだけどな。
コントローラー独自のものであればコントローラーに紐づければいいけどDB全般ならコンテキストでいいのではないか。
でもまあ、ファイル的には同じコントローラーで使うわけだ。
コントローラーで都度紐づけても大した手間ではないし明示できるともいえるか。
でも、DB接続を含むかどうかまではミドルウェアでいいかな。。
遅延ロード的なのが、、べつにいい気がする。

### goa tips: swagger-ui がサービスできないときのドキュメントどうする問題 - 押してダメならふて寝しろ
http://ikawaha.hateblo.jp/entry/2016/10/20/102425

おお、すごい、変換しまくるよ。

* bootprint
* swagger-codegen-cl
* swagger2markdown

SwaggerファイルをHTMLへ変換する - Qiita
http://qiita.com/fanfanta/items/47b5a79d8a9d3736b7eb

### goa tips: 小ネタ (swaggerドキュメントの抑制とパラメータ必須要素について) - 押してダメならふて寝しろ
http://ikawaha.hateblo.jp/entry/2016/12/18/124825

* swagger uiがapidocに記載される件の問題解決。
* 必須項目の設定のスマートな方法。


## 持ち越し課題感

* newなどの初期化によるStructタグの保持とreflectの処理
* ポインタとかまわり
* goaの使い方
* ディレクトリ構造とか綺麗にしたい