Line data Source code
1 : package util
2 :
3 : import (
4 : "sync/atomic"
5 : )
6 :
7 : // maskerHolder は常に同じ具体型で atomic.Value に載せるためのラッパ。
8 : type maskerHolder struct {
9 : M Masker
10 : }
11 :
12 : var globalMasker atomic.Value // 中身は常に maskerHolder
13 :
14 4 : func init() {
15 4 : // 初期値: Noop
16 4 : globalMasker.Store(maskerHolder{M: NoopMasker{}})
17 4 : }
18 :
19 : // SetGlobalMasker はグローバル Masker を差し替える。
20 : // ラッパ型に包むことで atomic.Value の具体型が不変になり、panic を防ぐ。
21 0 : func SetGlobalMasker(m Masker) {
22 0 : if m == nil {
23 0 : return
24 0 : }
25 0 : globalMasker.Store(maskerHolder{M: m})
26 : }
27 :
28 : // GlobalMasker は現在のグローバル Masker を返す。
29 2 : func GlobalMasker() Masker {
30 2 : v := globalMasker.Load()
31 2 : if v == nil {
32 0 : return NoopMasker{}
33 0 : }
34 2 : h, ok := v.(maskerHolder)
35 2 : if !ok || h.M == nil {
36 0 : return NoopMasker{}
37 0 : }
38 2 : return h.M
39 : }
|