88 "strconv"
99 "strings"
1010 "sync"
11+ "time"
1112
1213 "github.com/rs/xid"
1314 "go.uber.org/atomic"
@@ -22,61 +23,41 @@ func Bool(name string) *atomic.Bool {
2223 return Any (name , atomic .NewBool (false ))
2324}
2425
25- func Float (name string ) * expvar.Float {
26- mux .Lock ()
27- defer mux .Unlock ()
28-
29- v := expvar .Get (name )
30- if v == nil {
31- return expvar .NewFloat (name )
32- }
33- return v .(* expvar.Float )
26+ func Float (name string ) * atomic.Float64 {
27+ return Any (name , atomic .NewFloat64 (0 ))
3428}
3529
36- func Int (name string ) * expvar.Int {
37- mux .Lock ()
38- defer mux .Unlock ()
39-
40- v := expvar .Get (name )
41- if v == nil {
42- return expvar .NewInt (name )
43- }
44- return v .(* expvar.Int )
30+ func Int (name string ) * atomic.Int64 {
31+ return Any (name , atomic .NewInt64 (0 ))
4532}
4633
47- func String (name string ) * expvar .String {
48- mux . Lock ( )
49- defer mux . Unlock ()
34+ func String (name string ) * atomic .String {
35+ return Any ( name , atomic . NewString ( "" ) )
36+ }
5037
51- v := expvar .Get (name )
52- if v == nil {
53- return expvar .NewString (name )
54- }
55- return v .(* expvar.String )
38+ func Duration (name string ) * atomic.Duration {
39+ return Any (name , atomic .NewDuration (0 ))
5640}
5741
58- func Map (name string ) * expvar. Map {
59- mux . Lock ( )
60- defer mux . Unlock ()
42+ func Time (name string ) * atomic. Time {
43+ return Any ( name , atomic . NewTime ( time . Now ()) )
44+ }
6145
62- v := expvar .Get (name )
63- if v == nil {
64- return expvar .NewMap (name )
65- }
66- return v .(* expvar.Map )
46+ func Error (name string ) * atomic.Error {
47+ return Any (name , atomic .NewError (nil ))
6748}
6849
69- var _ json.Marshaler = (* Value )(nil )
50+ var _ json.Marshaler = (* Func )(nil )
7051
71- type Value func () any
52+ type Func func () any
7253
73- func (f Value ) MarshalJSON () ([]byte , error ) {
54+ func (f Func ) MarshalJSON () ([]byte , error ) {
7455 return json .Marshal (f ())
7556}
7657
77- func (f Value ) Value () any { return f () }
58+ func (f Func ) Value () any { return f () }
7859
79- func (f Value ) String () (r string ) {
60+ func (f Func ) String () (r string ) {
8061 return toString (f ())
8162}
8263
@@ -87,6 +68,7 @@ func errToString(err error) string {
8768
8869 return strconv .Quote (fmt .Sprintf ("err:%s detail:%#v" , err .Error (), err ))
8970}
71+
9072func toString (dt any ) (r string ) {
9173 var jsonStr = func (data any ) string {
9274 ret , err := json .Marshal (data )
@@ -106,6 +88,8 @@ func toString(dt any) (r string) {
10688 return strconv .Quote (dt )
10789 case []byte :
10890 return strconv .Quote (string (dt ))
91+ case json.Marshaler :
92+ return jsonStr (dt )
10993 case fmt.Stringer :
11094 return strconv .Quote (dt .String ())
11195 case error :
@@ -142,9 +126,7 @@ func (a anyValue) MarshalJSON() ([]byte, error) {
142126 return json .Marshal (a .v )
143127}
144128
145- func (a anyValue ) Value () any { return a .v }
146-
147- func Register (name string , value Value ) {
129+ func Register (name string , value Func ) {
148130 assert .If (Has (name ), "name:%s already exists" , name )
149131 expvar .Publish (name , value )
150132}
0 commit comments