goにはnet/contextという便利なパッケージがあり
これはgoroutineのキャンセル処理などを実装するのに便利な構造をしています。
トークンなどの値を持たせることもできてその値を設定する方法はKey/Valueでやるのですが
ctx := context.WithValue("ip", "127.0.0.1")
という風にkeyを設定してしまうともしほかパッケージでもip
というKeyがあれば競合を起こしてしまいます。
で、どうやって競合を起こさせないようにするかというと
keyになる変数のアドレスをkeyにします。
package ip
var ipKey string
func WithIP(ctx context.Context, ip string) context.Context {
return context.WithValue(ctx, &ipKey, ip)
}
func FromContext(ctx context.Context) string {
if v, ok := ctx.Value(&ipKey).(string); ok {
return v
}
return ""
}