26
Go 1.7のContextを net/httpで使ってみた Go conference 2017 @fkm / @mokelab

Go conference 2017 Lightning talk

  • Upload
    mokelab

  • View
    779

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Go conference 2017 Lightning talk

Go 1.7のContextをnet/httpで使ってみた

Go conference 2017@fkm / @mokelab

Page 2: Go conference 2017 Lightning talk
Page 3: Go conference 2017 Lightning talk

● スマホアプリを書いたり● レクチャーしたり● 情報発信したり

何やってるの?

Page 4: Go conference 2017 Lightning talk

● グッズもあるよ♪

何やってるの?

Page 5: Go conference 2017 Lightning talk

Contextとは?

Page 6: Go conference 2017 Lightning talk

リクエストのキャンセル用

インターフェース

Page 7: Go conference 2017 Lightning talk

は、@lestrratさんがきっと説明済み。。。

Page 8: Go conference 2017 Lightning talk

そのリクエストに関するデータを

保存できる

Page 9: Go conference 2017 Lightning talk

WithValue()

Page 10: Go conference 2017 Lightning talk

c := r.Context()c = context.WithValue( c, "name", // キー "moke", // 値)

いれる

Page 11: Go conference 2017 Lightning talk

c := r.Context()name := c.Value("name")// nameは// interface{} or nil

とってくる

Page 12: Go conference 2017 Lightning talk

// interface{}なので。。。name, ok := c.Value("name").(string)if !ok { // エラーレスポンス}

とってくる

Page 13: Go conference 2017 Lightning talk

現実の課題

Page 14: Go conference 2017 Lightning talk

func myHandler(w, r) { contentType := ... auth := ... accept := ... // メインの処理}

とあるHandler

Page 15: Go conference 2017 Lightning talk

func getUserHandler(w, r) { contentType := ... auth := ... accept := ... // メインの処理}

別のHandler

前処理

Page 16: Go conference 2017 Lightning talk

こんな風にしたい

Request

前処理メインの

処理

エラー

インターフェースが変わる(><)

Page 17: Go conference 2017 Lightning talk

Contextの出番

Request

前処理メインの

処理

インターフェースはそのまま

Context

Page 18: Go conference 2017 Lightning talk

ライブラリ書いてみた

Page 19: Go conference 2017 Lightning talk

イメージ

Request

メインの処理

Context

取得書き込み

Page 20: Go conference 2017 Lightning talk

リクエストに関する情報だけ

いれるべし

Page 21: Go conference 2017 Lightning talk

// GET /users/{id} 用handler := hop.Operations( hop.GetContentType, hop.GetPathString("id"),)(mainHandler)

コードは?

Page 22: Go conference 2017 Lightning talk

// getter関数で// 前処理の結果を取ってくるfunc mainHandler(w, r) { contentType := hop.ContentType(r.Context()) ... }

コードは?

Page 23: Go conference 2017 Lightning talk

handler := hop.Operations( hop.GetContentType, hop.GetPathString("id"),)(mainHandler)

何がいいの?

関数!

Page 24: Go conference 2017 Lightning talk

intとかstringとかいれると怒られるよ

$ golintmain.go:10:6: should not use basic type string as key in context.WithValue

WithValueのキー

Page 25: Go conference 2017 Lightning talk

別名をつければいいよ

type cKey stringconst keyID cKey = "id"

c = context.WithValue(c, keyID, "id1234")

WithValueのキー

Page 26: Go conference 2017 Lightning talk

素敵なContextライフを!