expvar包提供了公共变量的标准接口,如服务的操作计数器。本包通过HTTP在/debug/vars位置以JSON格式导出了这些变量。
对这些公共变量的读写操作都是原子级的。
为了增加HTTP处理器,本包注册了如下变量:
cmdline os.Args memstats runtime.Memstats
有时候本包被导入只是为了获得本包注册HTTP处理器和上述变量的副作用。此时可以如下方式导入本包:
import _ "expvar"
type Var
type Var interface {
String() string
}
Var接口是所有导出变量的抽象类型。
type Int
type Int struct {
i int64
}
Int代表一个64位整数变量,满足Var接口。
func NewInt
func NewInt(name string) *Int
func (*Int) Add
func (v *Int) Add(delta int64)
func (*Int) Set
func (v *Int) Set(value int64)
func (*Int) String
func (v *Int) String() string
type Float
type Float struct {
f uint64
}
Float代表一个64位浮点数变量,满足Var接口。
func NewFloat
func NewFloat(name string) *Float
func (*Float) Add
func (v *Float) Add(delta float64)
Add adds delta to v.
func (*Float) Set
func (v *Float) Set(value float64)
Set sets v to value.
func (*Float) String
func (v *Float) String() string
type String
type String struct {
s atomic.Value // string
}
String代表一个字符串变量,满足Var接口。
func NewString
func NewString(name string) *String
func (*String) Set
func (v *String) Set(value string)
func (*String) String
func (v *String) String() string
type Func
type Func func() interface{}
Func通过调用函数并将结果编码为json,实现了Var接口。
func (Func) String
func (f Func) String() string
type KeyValue
type KeyValue struct {
Key string
Value Var
}
KeyValue代表Map中的一条记录。(键值对)
type Map
type Map struct {
m sync.Map // map[string]Var
keysMu sync.RWMutex
keys []string // sorted
}
Map代表一个string到Var的映射变量,满足Var接口。
func NewMap
func NewMap(name string) *Map
func (*Map) Init
func (v *Map) Init() *Map
func (*Map) Get
func (v *Map) Get(key string) Var
func (*Map) Set
func (v *Map) Set(key string, av Var)
func (*Map) Add
func (v *Map) Add(key string, delta int64)
func (*Map) AddFloat
func (v *Map) AddFloat(key string, delta float64)
AddFloat向索引key对应的值(底层为*Float)修改为加上delta后的值。
func (*Map) Do
func (v *Map) Do(f func(KeyValue))
Do对映射的每一条记录都调用f。迭代执行时会锁定该映射,但已存在的记录可以同时更新。
func (*Map) String
func (v *Map) String() string
func Get
func Get(name string) Var
Get获取名为name的导出变量。
func Publish
func Publish(name string, v Var)
Publish声明一个导出变量。必须在init函数里调用。如果name已经被注册,会调用log.Panic。
func Do
func Do(f func(KeyValue))
Do对导出变量的每一条记录都调用f。迭代执行时会锁定全局变量映射,但已存在的记录可以同时更新。
有疑问加站长微信联系(非本文作者)