127 lines
1.8 KiB
Go
127 lines
1.8 KiB
Go
package svalue
|
|
|
|
import (
|
|
"errors"
|
|
"log"
|
|
"reflect"
|
|
"runtime"
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
// IValue 必须实现的值接口
|
|
type IValue interface {
|
|
// TakeValue 获取 value的方法覆盖
|
|
TakeValue() interface{}
|
|
|
|
// 每次 TakeValue 休眠的时间
|
|
UpdateInterval() time.Duration
|
|
|
|
// Lock value的锁
|
|
Lock()
|
|
// Unlock value的解锁
|
|
Unlock()
|
|
|
|
// SetValue 设置动态的值 TakeValue 调用
|
|
SetValue(v interface{})
|
|
|
|
Close()
|
|
IsClose() bool
|
|
|
|
SetSync(is bool)
|
|
IsSync() bool
|
|
}
|
|
|
|
// Value 必须设置的动态类型
|
|
type Value struct {
|
|
IValue
|
|
|
|
value interface{}
|
|
mutex sync.Mutex
|
|
|
|
isClose bool
|
|
isSync bool
|
|
}
|
|
|
|
func (value *Value) SetValue(v interface{}) {
|
|
value.value = v
|
|
}
|
|
|
|
func (value *Value) Lock() {
|
|
value.mutex.Lock()
|
|
}
|
|
|
|
func (value *Value) Unlock() {
|
|
value.mutex.Unlock()
|
|
}
|
|
|
|
func (value *Value) IsSync() bool {
|
|
return value.isSync
|
|
}
|
|
|
|
func (value *Value) SetSync(is bool) {
|
|
value.isSync = is
|
|
}
|
|
|
|
func (value *Value) GetValue() interface{} {
|
|
value.mutex.Lock()
|
|
defer value.mutex.Unlock()
|
|
return value.value
|
|
}
|
|
|
|
func (value *Value) Close() {
|
|
value.mutex.Lock()
|
|
defer value.mutex.Unlock()
|
|
value.isClose = true
|
|
}
|
|
|
|
func (value *Value) IsClose() bool {
|
|
return value.isClose
|
|
}
|
|
|
|
func (value *Value) TakeUpdateInterval() time.Duration {
|
|
return time.Second * 5
|
|
}
|
|
|
|
func StartSynchronize(value IValue) bool {
|
|
if !reflect.ValueOf(value.TakeValue).CanInterface() {
|
|
panic(errors.New("TakeValue method is need OverWrite"))
|
|
}
|
|
|
|
runtime.SetFinalizer(value, func(obj IValue) {
|
|
obj.Close()
|
|
})
|
|
|
|
if value.IsSync() {
|
|
return false
|
|
}
|
|
|
|
go func() {
|
|
|
|
for {
|
|
|
|
value.Lock()
|
|
|
|
value.SetValue(value.TakeValue())
|
|
isClose := value.IsClose()
|
|
|
|
value.Unlock()
|
|
|
|
if isClose {
|
|
log.Println(value, "is Closed")
|
|
break
|
|
}
|
|
time.Sleep(value.UpdateInterval())
|
|
if isClose {
|
|
log.Println(value, "is Closed")
|
|
break
|
|
}
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
value.SetSync(true)
|
|
return true
|
|
}
|