Go Contextを使ってみる

GoのContextを使用してみたのでスニペットとして残しておく

package main

import (
    "context"
    "fmt"
)

var ctx context.Context
var c   context.Context
func init() {
    ctx = context.Background()
}

type Values struct {
    m map[string]string
}

func (v Values) Get(key string) string {
    return v.m[key]
}
func GetMyValue(key string) string {
    return c.Value("MyValues").(Values).Get(key)
}
func main() {
    v := Values{map[string]string{
        "1": "one",
        "2": "two",
    }}

    c = context.WithValue(ctx, "MyValues", v)
    fmt.Println(GetMyValue("2"))
}

Go PlayGround

コンテキストはグローバルで扱うことのできる値の格納場所として使用することができます。
ただし、入れる値はリクエストスコープに限定します。
例えば、APIクライアントだったりクライアントに依存する環境変数などをいれる場所する場所として扱い、それ以外の値は入れないようにします。

Contextをミドルウェアにしてしまって特定のルーティング配下で使えるようにするのがよい実装方法ではないかと。

関連記事