Documentation
¶
Overview ¶
* 采用cas实现乐观锁及TryLock Compare And Swap 简称CAS,在sync/atomic包种 这类原子操作由名称以‘CompareAndSwap’为前缀的若干个函数代表。 声明如下
func CompareAndSwapInt32(addr *int32, old, new int32) (swapped bool)
调用函数后,会先判断参数addr指向的被操作值与参数old的值是否相等 仅当此判断得到肯定的结果之后,才会用参数new代表的新值替换掉原先的旧值,否则操作就会被忽略。 so, 需要用for循环不断进行尝试,直到成功为止
使用锁的做法趋于悲观
我们总假设会有并发的操作要修改被操作的值,并使用锁将相关操作放入临界区中加以保护
使用CAS操作的做法趋于乐观
总是假设被操作值未曾被改变(即与旧值相等),并一旦确认这个假设的真实性就立即进行值替换。
chan实现trylock乐观锁
*
- 每天流动式日志实现
- 操作日志记录到文件,支持info,error,debug,notice,alert等
- 写日志文件的时候,采用乐观锁方式对文件句柄进行加锁
- 等级参考php Monolog/logger.php
- 日志切割机制参考lumberjack包实现
- json encode采用jsoniter库快速json encode处理
Index ¶
- Constants
- Variables
- func AlterLog(v interface{}, options interface{})
- func CatchStack() []byte
- func CheckPanic()
- func CheckPathExist(path string) bool
- func Chown(name string, info os.FileInfo) error
- func CopyFile(distName, srcName string) (w int64, err error)
- func CritLog(v interface{}, options interface{})
- func DeAES(in, key, iv []byte) ([]byte, error)
- func DebugLog(v interface{}, options interface{})
- func EmergLog(v interface{}, options interface{})
- func EnAES(in, key, iv []byte) ([]byte, error)
- func ErrorLog(v interface{}, options interface{})
- func Filebase(file string) string
- func Fileline(file string, line int) string
- func FormatNow() string
- func FormatTime(t time.Time) string
- func FormatTime19(t time.Time) string
- func FormatUTC() string
- func GetCurrentLocalTime() string
- func GetLoc(zone string) *time.Location
- func GetTimeByTimeZone(zone string) string
- func Gunzip(in []byte) ([]byte, error)
- func Gzip(in []byte) ([]byte, error)
- func Hash(mem []byte) uint64
- func InfoLog(v interface{}, options interface{})
- func Int64ToStr(i64 int64) string
- func IntToStr(n int) string
- func IsSystemdService() bool
- func Krand(size int, kind int) string
- func ListenRpc(addr string, obj interface{}) error
- func ListenSocket(addr string, keepalive bool, reactiver func(net.Conn)) error
- func ListenUdp(addr string, bufsize int, reactiver func(*net.UDPAddr, []byte) []byte) error
- func LoadGobData(data interface{}, fileName string)
- func LogSize(n int64)
- func LogSplit(b bool)
- func Md5(str string) string
- func NewUUID() string
- func NoticeLog(v interface{}, options interface{})
- func NumberNow() uint64
- func NumberTime(t time.Time) uint64
- func NumberUTC() uint64
- func ParseNumber(t uint64) (time.Time, error)
- func ParseNumberUTC(t uint64) (time.Time, error)
- func ParseTime(s string) (time.Time, error)
- func ParseTimeUTC(s string) (time.Time, error)
- func RandInt64(min, max int64) int64
- func RndUuid() string
- func RndUuidMd5() string
- func Round(f float64, n int) float64
- func RunShell(exeStr string) (string, error)
- func SetLogDir(dir string)
- func SetLogTimeZone(timezone string)
- func SetTimeZone(zone string)
- func Sha1(str string) string
- func Stack() []byte
- func StoreGobData(data interface{}, fileName string) error
- func StrJoin(sep string, str ...string) string
- func StrJoinByBuf(str ...string) string
- func StrToInt(s string) int
- func StrToInt64(s string) int64
- func StringMapKeys(m interface{}) (res []string)
- func Uuid() string
- func WarnLog(v interface{}, options interface{})
- func Xss(str string) string
- func XssUnescape(str string) string
- type ChanLock
- type EmptyArray
- type EmptyStruct
- type H
- type Lock
- type Mutex
- type Semaphore
- type StringList
- type TaskRes
- func DoTask(fn func() interface{}) *TaskRes
- func DoTaskWithArgs(fn func(args ...interface{}) interface{}, args ...interface{}) *TaskRes
- func DoTaskWithContext(ctx context.Context, fn func() interface{}, timeout time.Duration) *TaskRes
- func DoTaskWithContextArgs(ctx context.Context, fn func(args ...interface{}) interface{}, ...) *TaskRes
- func DoTaskWithTimeout(fn func() interface{}, timeout time.Duration) *TaskRes
- func DoTaskWithTimeoutArgs(fn func(args ...interface{}) interface{}, timeout time.Duration, ...) *TaskRes
Constants ¶
const ( EMERGENCY = "emerg" // 严重错误: 导致系统崩溃无法使用 ALERT = "alter" // 警戒性错误: 必须被立即修改的错误 CRIT = "crit" // 临界值错误: 超过临界值的错误,例如一天24小时,而输入的是25小时这样 ERR = "error" // 一般错误:比如类型错误,数据库连接不上等等 WARN = "warn" // 警告性错误: 需要发出警告的错误 NOTICE = "notice" // 通知: 程序可以运行但是还不够完美的错误 INFO = "info" // 信息: 程序输出信息 DEBUG = "debug" // 调试: 调试信息 )
日志级别 从上到下,由高到低
Variables ¶
var LogLevelMap = map[string]int{ EMERGENCY: 600, ALERT: 550, CRIT: 500, ERR: 400, WARN: 300, NOTICE: 250, INFO: 200, DEBUG: 100, }
var TimeZone = "Local" //默认时区设置,可以是Local本地时区
Functions ¶
func CatchStack ¶
func CatchStack() []byte
CatchStack 捕获指定stack信息,一般在处理panic/recover中处理 返回完整的堆栈信息和函数调用信息
func CheckPathExist ¶ added in v1.1.6
check file or path exist
func FormatTime ¶
format a time.Time to string as 2006-01-02 15:04:05.999
func FormatTime19 ¶
format a time.Time to string as 2006-01-02 15:04:05 将time.time转换为日期格式
func GetTimeByTimeZone ¶
func IsSystemdService ¶
func IsSystemdService() bool
func NewUUID ¶
func NewUUID() string
NewUUID 通过随机数的方式生成uuid 如果rand.Read失败,就按照当前时间戳+随机数进行md5方式生成 该方式生成的uuid有可能存在重复值 返回格式:7999b726-ca3c-42b6-bda2-259f4ac0879a
func NumberTime ¶
format a time.Time to number as 20060102150405999
func ParseTimeUTC ¶
parse a string as "2006-01-02 15:04:05.999" to time.Time
func RndUuid ¶
func RndUuid() string
RndUuid 基于时间ns和随机数实现唯一的uuid 在单台机器上是不会出现重复的uuid 如果要在分布式的架构上生成不重复的uuid 只需要在rndStr的前面加一些自定义的字符串 返回格式:eba1e8cd-0460-4910-49c6-44bdf3cf024d
func SetTimeZone ¶
func SetTimeZone(zone string)
func Stack ¶
func Stack() []byte
Stack 获取完整的堆栈信息 Stack returns a formatted stack trace of the goroutine that calls it. It calls runtime.Stack with a large enough buffer to capture the entire trace.
func StoreGobData ¶
func StringMapKeys ¶
func StringMapKeys(m interface{}) (res []string)
func XssUnescape ¶
Types ¶
type ChanLock ¶
type ChanLock struct {
// contains filtered or unexported fields
}
func NewChanLock ¶
func NewChanLock() *ChanLock
func (*ChanLock) TryLockTimeout ¶
指定时间内的乐观锁
type EmptyArray ¶ added in v1.1.5
type EmptyArray []struct{}
EmptyArray 兼容其他语言的[]空数组,一般在tojson的时候转换为[]
type Semaphore ¶
type Semaphore struct {
// contains filtered or unexported fields
}
分配安全的bool chan
func NewSemaphore ¶
type StringList ¶
type StringList []string
str list
func (StringList) Count ¶
func (this StringList) Count() int
func (StringList) Delete ¶
func (this StringList) Delete(token string) int
func (StringList) IsEmpty ¶
func (this StringList) IsEmpty() bool
func (StringList) Len ¶
func (this StringList) Len() int
func (StringList) Less ¶
func (this StringList) Less(i, j int) bool
func (StringList) Swap ¶
func (this StringList) Swap(i, j int)
func (StringList) UniqueAdd ¶
func (this StringList) UniqueAdd(token string) StringList
type TaskRes ¶ added in v1.1.5
dotask返回的结果
func DoTask ¶ added in v1.1.5
func DoTask(fn func() interface{}) *TaskRes
DoTask 在独立携程中运行fn 这里返回结果设计为interface{},因为有时候返回结果可以是error
func DoTaskWithArgs ¶ added in v1.1.5
func DoTaskWithArgs(fn func(args ...interface{}) interface{}, args ...interface{}) *TaskRes
DoTaskWithArgs 在独立携程中执行有参数的fn
func DoTaskWithContext ¶ added in v1.1.5
DoTaskWithContext 通过上下文context+done+select实现goroutine超时调用
func DoTaskWithContextArgs ¶ added in v1.1.5
func DoTaskWithContextArgs(ctx context.Context, fn func(args ...interface{}) interface{}, timeout time.Duration, args ...interface{}) *TaskRes
DoTaskWithContextArgs 通过上下文context+done+select实现goroutine超时调用
func DoTaskWithTimeout ¶ added in v1.1.5
DoTaskWithTimeout 采用done+select+time.After实现goroutine超时调用
func DoTaskWithTimeoutArgs ¶ added in v1.1.5
func DoTaskWithTimeoutArgs(fn func(args ...interface{}) interface{}, timeout time.Duration, args ...interface{}) *TaskRes
DoTaskWithTimeoutArgs 采用done+select+time.After实现goroutine超时调用