開催後記
お越しいただき、ありがとうございました!
先日(11/23)のShizuoka.goが開催されました。 お越しいただいた皆さんありがとうございました。
発表者のみなさんもありがとうございました。発表者の方がいらっしゃると非常に助かります。 なんとHDMIケーブルが断線するというトラブルに見舞われましたが、なんとかなってよかった。
クラウド周りでは、今まで比較的GCPだったのに、最近はAWSの発表が続いているので、 Azure辺りの話もあると面白いですね。
少しだけ自分の発表に少し書いたHTTPアクセス時の前処理等を行うMiddlewareの詳細を書いていきたいと思います。
Middlewareについて
最後の方にhttp.LlistenAndServe()の第2引数のHandleについて話しました。 そこでオマケとして書いたMiddlewareの話です。
先日10周年を記念して開いたサイトであるgo.devの
Go Web Example - Middleware(Basic)
に簡単なものが書いてあります。 これは読めばわかると思いますが、HandleFuncで登録する時にhttp.HandlerFuncを引数に持ち、http.HandlerFuncを返す関数logging()を呼んでいます。
このパターンだと登録時に少し面倒くさい気もしていました。これだけならHandleを登録して、その処理でログを出力すればよいように見えます。
ということでadvanceになります。
Go Web Example - Middleware(Advance)
簡単なものはHandleでいけるのですが、 それぞれのパーツを順序とか色々考えて作るとこのパターンがいいのかなぁと思うようになってきました。 ※確実なものはHandleでやって、こっちで細かいのみたいな感じになるのかな?
type Middleware func(http.HandlerFunc) http.HandlerFunc
Middlewareはinterfaceで定義しておいて、 実行したいhttp.HandlerFuncの後ろに実行したいMiddlewareを書いていく感じですね。 ページのサンプルに対してdeferを書き、それぞれのトレースを残したコードをplaygroundに書いてみました。
Chainの戻り値を呼び出しています。 通常はサンプル通り、http.HandleFunc()で登録し、サーバでリクエストが来たら動作する感じです。
このコードを実行して見たらわかりますが、Chain()の最後にある引数から開始し、目的の関数まで実行されます。 deferはその逆に実行していくわけです。deferが強烈ですね。
次回開催について
一応2020年3月を予定しております。 その前の2月に1.14のパーティをやると思います。おっさん一人で飲んでますのでお暇なら慰めに来てください。
Gopherについて
このGopherは
medium.com/@matryer/the-secret-api-behind-gopherize-me-9202654578dc
より持ってきました。