1 Star 0 Fork 0

llakcs / agile-go

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
value.go 2.97 KB
一键复制 编辑 原始数据 按行查看 历史
llakcs 提交于 2024-01-31 16:54 . 第一次提交
package config
import (
"fmt"
"reflect"
"strconv"
"sync/atomic"
"time"
)
type Value interface {
Bool() (bool, error)
Int() (int64, error)
Float() (float64, error)
String() (string, error)
Duration() (time.Duration, error)
}
type atomicValue struct {
atomic.Value
}
func NewAtomicValue() *atomicValue {
return &atomicValue{}
}
func (a *atomicValue) typeAssertError() error {
return fmt.Errorf("type assert to %v failed", reflect.TypeOf(a.Load()))
}
func (a *atomicValue) Duration() (time.Duration, error) {
val, err := a.Int()
if err != nil {
return 0, err
}
return time.Duration(val), nil
}
func (a *atomicValue) String() (string, error) {
switch val := a.Load().(type) {
case string:
return val, nil
case bool, int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, float32, float64:
return fmt.Sprint(val), nil
case []byte:
return string(val), nil
case fmt.Stringer:
return val.String(), nil
}
return "", a.typeAssertError()
}
func (a *atomicValue) Float() (float64, error) {
switch val := a.Load().(type) {
case int:
return float64(val), nil
case int8:
return float64(val), nil
case int16:
return float64(val), nil
case int32:
return float64(val), nil
case int64:
return float64(val), nil
case uint:
return float64(val), nil
case uint8:
return float64(val), nil
case uint16:
return float64(val), nil
case uint32:
return float64(val), nil
case uint64:
return float64(val), nil
case float32:
return float64(val), nil
case float64:
return val, nil
case string:
return strconv.ParseFloat(val, 64)
}
return 0.0, a.typeAssertError()
}
func (a *atomicValue) Bool() (bool, error) {
switch val := a.Load().(type) {
case bool:
return val, nil
case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, float32, float64, string:
return strconv.ParseBool(fmt.Sprint(val))
}
return false, a.typeAssertError()
}
func (a *atomicValue) Int() (int64, error) {
switch val := a.Load().(type) {
case int:
return int64(val), nil
case int8:
return int64(val), nil
case int16:
return int64(val), nil
case int32:
return int64(val), nil
case int64:
return val, nil
case uint:
return int64(val), nil
case uint8:
return int64(val), nil
case uint16:
return int64(val), nil
case uint32:
return int64(val), nil
case uint64:
return int64(val), nil
case float32:
return int64(val), nil
case float64:
return int64(val), nil
case string:
return strconv.ParseInt(val, 10, 64)
}
return 0, a.typeAssertError()
}
type errValue struct {
err error
}
func (v errValue) Bool() (bool, error) { return false, v.err }
func (v errValue) Int() (int64, error) { return 0, v.err }
func (v errValue) Float() (float64, error) { return 0.0, v.err }
func (v errValue) Duration() (time.Duration, error) { return 0, v.err }
func (v errValue) String() (string, error) { return "", v.err }
func (v errValue) Load() interface{} { return nil }
func (v errValue) Store(interface{}) {}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/llakcs/agile-go.git
git@gitee.com:llakcs/agile-go.git
llakcs
agile-go
agile-go
v1.2.0

搜索帮助

344bd9b3 5694891 D2dac590 5694891