utils

package module
v1.11.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 25, 2020 License: MIT Imports: 41 Imported by: 22

README

Go-Utils

Many useful golang tools, support >= v1.12.

Commitizen friendly Go Report Card GoDoc Build Status codecov

Install:

go get github.com/Laisky/go-utils

Usage

import (
    utils "github.com/Laisky/go-utils"
)

Read the document or test file to get more details.

Documentation

Overview

Package utils 一些常用工具

Index

Examples

Constants

View Source
const (
	HTTPJSONHeader    = "Content-Type"
	HTTPJSONHeaderVal = "application/json"
)

HTTP defines

View Source
const (
	// SampleRateDenominator sample rate = sample / SampleRateDenominator
	SampleRateDenominator = 1000
)

Variables

View Source
var (
	// ParseTs2UTC can parse unix timestamp(int64) to time.Time
	ParseTs2UTC = ParseUnix2UTC
	// ParseTs2String can parse unix timestamp(int64) to string
	ParseTs2String = ParseUnix2String
)
View Source
var (
	// ParseTs2Time can parse unix timestamp(int64) to time.Time
	ParseTs2Time = ParseTs2UTC
	// UnixNano2UTC convert unixnano to UTC time
	UnixNano2UTC = ParseUnixNano2UTC
)
View Source
var (
	// Clock high performance time utils, replace Clock1
	Clock = NewClock(context.Background(), defaultClockInterval)

	// Clock2 high performance time utils
	Clock2 = Clock
	// NewClock2 create new Clock
	NewClock2 = NewClock
)
View Source
var (
	// ForceGC force to start gc blocking
	ForceGC = ForceGCBlocking
	// TriggerGC force to start gc unblocking
	TriggerGC = ForceGCUnBlocking
)
View Source
var Settings = &SettingsType{
	YamlExt: "yaml",
}

Settings is the settings for this project

Functions

func AutoGC added in v1.10.2

func AutoGC(ctx context.Context, opts ...GcOptFunc) (err error)

AutoGC auto trigger GC when memory usage exceeds the custom ration

Example
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
defer cancel()
if err := AutoGC(
	ctx,
	WithGCMemRatio(85), // default
	WithGCMemLimitFilePath("/sys/fs/cgroup/memory/memory.limit_in_bytes"), // default
); err != nil {
	Logger.Error("enable autogc", zap.Error(err))
}
Output:

func CheckResp

func CheckResp(resp *http.Response) error

CheckResp check HTTP response's status code and return the error with body message

func DirSize added in v1.10.1

func DirSize(path string) (size int64, err error)

DirSize calculate directory size. https://stackoverflow.com/a/32482941/2368737

Example
dirPath := "."
size, err := DirSize(dirPath)
if err != nil {
	Logger.Error("get dir size", zap.Error(err), zap.String("path", dirPath))
}
Logger.Info("got size", zap.Int64("size", size), zap.String("path", dirPath))
Output:

func FallBack

func FallBack(orig func() interface{}, fallback interface{}) (ret interface{})

FallBack return the fallback when orig got error utils.FallBack(func() interface{} { return getIOStatMetric(fs) }, &IOStat{}).(*IOStat)

Example
targetFunc := func() interface{} {
	panic("someting wrong")
}

FallBack(targetFunc, 10) // got 10
Output:

func FlattenMap

func FlattenMap(data map[string]interface{}, delimiter string)

FlattenMap make embedded map into flatten map

Example
data := map[string]interface{}{
	"a": "1",
	"b": map[string]interface{}{
		"c": 2,
		"d": map[string]interface{}{
			"e": 3,
		},
	},
}
FlattenMap(data, "__") // {"a": "1", "b__c": 2, "b__d__e": 3}
Output:

func ForceGCBlocking added in v1.7.4

func ForceGCBlocking()

ForceGCBlocking force to run blocking manual gc.

Example
ForceGCBlocking()
Output:

func ForceGCUnBlocking added in v1.7.4

func ForceGCUnBlocking()

ForceGCUnBlocking trigger GC unblocking

Example
ForceGCUnBlocking()
Output:

func GeneratePasswordHash added in v1.2.0

func GeneratePasswordHash(password []byte) ([]byte, error)

GeneratePasswordHash generate hashed password by origin password

Example
// generate hashed password
rawPassword := []byte("1234567890")
hashedPassword, err := GeneratePasswordHash(rawPassword)
if err != nil {
	Logger.Error("try to generate password got error", zap.Error(err))
	return
}
fmt.Printf("got new hashed pasword: %v\n", string(hashedPassword))

// validate passowrd
if !ValidatePasswordHash(hashedPassword, rawPassword) {
	Logger.Error("password invalidate", zap.Error(err))
	return
}
Output:

func GetFuncName

func GetFuncName(f interface{}) string

GetFuncName return the name of func

Example
GetFuncName(testFoo) // "github.com/Laisky/go-utils_test.testFoo"
Output:

func HTTPInvalidStatusError

func HTTPInvalidStatusError(statusCode int) error

HTTPInvalidStatusError return error about status code

func HashSHA128String added in v1.10.2

func HashSHA128String(val string) string

HashSHA128String calculate string's hash by sha256

Example
val := "dfij3ifj2jjl2jelkjdkwef"
got := HashSHA128String(val)
Logger.Info("hash", zap.String("got", got))
Output:

func HashSHA256String added in v1.10.1

func HashSHA256String(val string) string

HashSHA256String calculate string's hash by sha256

Example
val := "dfij3ifj2jjl2jelkjdkwef"
got := HashSHA256String(val)
Logger.Info("hash", zap.String("got", got))
Output:

func HashXxhashString added in v1.10.1

func HashXxhashString(val string) string

HashXxhashString calculate string's hash by sha256

Example
val := "dfij3ifj2jjl2jelkjdkwef"
got := HashXxhashString(val)
Logger.Info("hash", zap.String("got", got))
Output:

func MaxInt added in v1.11.1

func MaxInt(a, b int) int

func MinInt added in v1.11.1

func MinInt(a, b int) int

func ParseHex2UTC added in v1.8.0

func ParseHex2UTC(ts string) (t time.Time, err error)

ParseHex2UTC parse hex to UTC time

func ParseHexNano2UTC added in v1.8.0

func ParseHexNano2UTC(ts string) (t time.Time, err error)

ParseHexNano2UTC parse hex contains nano to UTC time

func ParseJWTTokenWithoutValidate added in v1.10.0

func ParseJWTTokenWithoutValidate(token string) (payload jwt.MapClaims, err error)

ParseJWTTokenWithoutValidate parse and get payload without validate jwt token

func ParseUnix2String added in v1.8.0

func ParseUnix2String(ts int64, layout string) string

ParseUnix2String can parse unix timestamp(int64) to string

func ParseUnix2UTC added in v1.8.0

func ParseUnix2UTC(ts int64) time.Time

ParseUnix2UTC convert unix to UTC time

func ParseUnixNano2UTC added in v1.8.0

func ParseUnixNano2UTC(ts int64) time.Time

ParseUnixNano2UTC convert unixnano to UTC time

func RandomStringWithLength

func RandomStringWithLength(n int) string

RandomStringWithLength generate random string with specific length

func RegexNamedSubMatch

func RegexNamedSubMatch(r *regexp.Regexp, str string, subMatchMap map[string]string) error

RegexNamedSubMatch extract key:val map from string by group match

Example
reg := regexp.MustCompile(`(?P<key>\d+.*)`)
str := "12345abcde"
groups := map[string]string{}
if err := RegexNamedSubMatch(reg, str, groups); err != nil {
	Logger.Error("try to group match got error", zap.Error(err))
}

fmt.Printf("got: %+v", groups) // map[string]string{"key": 12345}
Output:

func RequestJSON

func RequestJSON(method, url string, request *RequestData, resp interface{}) (err error)

RequestJSON request JSON and return JSON by default client

func RequestJSONWithClient

func RequestJSONWithClient(httpClient *http.Client, method, url string, request *RequestData, resp interface{}) (err error)

RequestJSONWithClient request JSON and return JSON with specific client

func Round

func Round(val float64, roundOn float64, places int) (newVal float64)

Round Golang does not include a round function in the standard math package Round(123.555555, .5, 3) -> 123.556

Example
utils.Round(123.555555, .5, 3) // got 123.556
Output:

func SetStructFieldsBySlice added in v1.11.1

func SetStructFieldsBySlice(structs, vals interface{}) (err error)

SetStructFieldsBySlice set field value of structs slice by values slice

Example
type ST struct{ A, B string }
var (
	err error
	ss  = []*ST{{}, {}}
	vs  = [][]string{
		{"x0", "y0"},
		{"x1", "y1"},
	}
)
if err = SetStructFieldsBySlice(ss, vs); err != nil {
	Logger.Error("set struct val", zap.Error(err))
	return
}

fmt.Printf("%+v\n", ss)
//
Output:

func SetupClock

func SetupClock(refreshInterval time.Duration)

SetupClock setup internal Clock with step

func TemplateWithMap added in v1.5.4

func TemplateWithMap(tpl string, data map[string]interface{}) string

TemplateWithMap replace `${var}` in template string

func TemplateWithMapAndRegexp added in v1.5.4

func TemplateWithMapAndRegexp(tplReg *regexp.Regexp, tpl string, data map[string]interface{}) string

TemplateWithMapAndRegexp replace `${var}` in template string

func URLMasking added in v1.9.3

func URLMasking(url, mask string) string

URLMasking masking password in url

Example
originURL := "http://12ijij:3j23irj@jfjlwef.ffe.com"
newURL := URLMasking(originURL, "*****")
fmt.Println(newURL) // http://12ijij:*****@jfjlwef.ffe.com
Output:

func UTCNow

func UTCNow() time.Time

UTCNow 获取当前 UTC 时间

func ValidatePasswordHash added in v1.2.0

func ValidatePasswordHash(hashedPassword, password []byte) bool

ValidatePasswordHash validate password is match with hashedPassword

Types

type AcquireLockOptFunc added in v1.10.0

type AcquireLockOptFunc func(*acquireLockOption) error

AcquireLockOptFunc options for acquire lock

func WithAcquireLockDuration added in v1.10.0

func WithAcquireLockDuration(duration time.Duration) AcquireLockOptFunc

WithAcquireLockDuration set how long to extend lock

func WithAcquireLockIsRenewal added in v1.10.0

func WithAcquireLockIsRenewal(isRenewal bool) AcquireLockOptFunc

WithAcquireLockIsRenewal set whether to auto renewal lock

func WithAcquireLockMaxRetry added in v1.10.0

func WithAcquireLockMaxRetry(maxRetry int) AcquireLockOptFunc

WithAcquireLockMaxRetry set max retry to acquire lock

func WithAcquireLockRenewalInterval added in v1.10.0

func WithAcquireLockRenewalInterval(renewalInterval time.Duration) AcquireLockOptFunc

WithAcquireLockRenewalInterval set how ofter to renewal lock

type AlertHookOptFunc added in v1.10.0

type AlertHookOptFunc func(*alertHookOption)

AlertHookOptFunc option for create AlertHook

func WithAlertHookLevel added in v1.9.0

func WithAlertHookLevel(level zapcore.Level) AlertHookOptFunc

WithAlertHookLevel level to trigger AlertHook

func WithAlertPushTimeout added in v1.9.0

func WithAlertPushTimeout(timeout time.Duration) AlertHookOptFunc

WithAlertPushTimeout set AlertPusher HTTP timeout

type AlertPusher added in v1.9.0

type AlertPusher struct {
	// contains filtered or unexported fields
}

AlertPusher send alert to laisky's alert API

https://github.com/Laisky/laisky-blog-graphql/tree/master/telegram

Example
package main

import (
	"context"
	"time"

	utils "github.com/Laisky/go-utils"
	zap "github.com/Laisky/zap"
)

func main() {
	pusher, err := utils.NewAlertPusherWithAlertType(
		context.Background(),
		"https://blog.laisky.com/graphql/query/",
		"hello",
		"rwkpVuAgaBZQBASKndHK",
	)
	if err != nil {
		utils.Logger.Panic("create alert pusher", zap.Error(err))
	}
	defer pusher.Close()
	logger := utils.Logger.WithOptions(
		zap.Fields(zap.String("logger", "test")),
		zap.HooksWithFields(pusher.GetZapHook()),
	)

	logger.Debug("DEBUG", zap.String("yo", "hello"))
	logger.Info("Info", zap.String("yo", "hello"))
	logger.Warn("Warn", zap.String("yo", "hello"))
	logger.Error("Error", zap.String("yo", "hello"))

	time.Sleep(1 * time.Second)
}
Output:

func NewAlertPusher added in v1.9.0

func NewAlertPusher(ctx context.Context, pushAPI string, opts ...AlertHookOptFunc) (a *AlertPusher, err error)

NewAlertPusher create new AlertPusher

func NewAlertPusherWithAlertType added in v1.9.0

func NewAlertPusherWithAlertType(ctx context.Context, pushAPI string, alertType, pushToken string, opts ...AlertHookOptFunc) (a *AlertPusher, err error)

NewAlertPusherWithAlertType create new AlertPusher with default type and token

func (*AlertPusher) Close added in v1.9.0

func (a *AlertPusher) Close()

Close close AlertPusher

func (*AlertPusher) GetZapHook added in v1.10.1

func (a *AlertPusher) GetZapHook() func(zapcore.Entry, []zapcore.Field) (err error)

GetZapHook get hook for zap logger

func (*AlertPusher) Send added in v1.9.0

func (a *AlertPusher) Send(msg string) (err error)

Send send with default alertType and pushToken

func (*AlertPusher) SendWithType added in v1.9.0

func (a *AlertPusher) SendWithType(alertType, pushToken, msg string) (err error)

SendWithType send alert with specific type, token and msg

type ChildParallelCounter added in v1.6.3

type ChildParallelCounter struct {
	sync.RWMutex
	// contains filtered or unexported fields
}

ChildParallelCounter child of ParallelCounter

func (*ChildParallelCounter) Count added in v1.6.3

func (c *ChildParallelCounter) Count() (r int64)

Count count 1

func (*ChildParallelCounter) CountN added in v1.6.3

func (c *ChildParallelCounter) CountN(n int64) (r int64)

CountN count n

func (*ChildParallelCounter) Get added in v1.6.3

func (c *ChildParallelCounter) Get() int64

Get get current count

type Clock2Type added in v1.7.3

type Clock2Type ClockType

Clock2Type high performance clock with lazy refreshing

type ClockItf added in v1.7.3

type ClockItf interface {
	GetTimeInRFC3339Nano() string
	GetUTCNow() time.Time
	SetupInterval(time.Duration)
	Close()
}

ClockItf high performance lazy clock

type ClockType

type ClockType struct {
	sync.RWMutex
	// contains filtered or unexported fields
}

ClockType high performance clock with lazy refreshing

func NewClock

func NewClock(ctx context.Context, refreshInterval time.Duration) *ClockType

NewClock create new Clock

func (*ClockType) Close added in v1.7.3

func (c *ClockType) Close()

Close stop Clock update

func (*ClockType) GetNanoTimeInHex added in v1.8.0

func (c *ClockType) GetNanoTimeInHex() string

GetNanoTimeInHex return current time with nano in hex

func (*ClockType) GetTimeInHex added in v1.8.0

func (c *ClockType) GetTimeInHex() string

GetTimeInHex return current time in hex

func (*ClockType) GetTimeInRFC3339Nano

func (c *ClockType) GetTimeInRFC3339Nano() string

GetTimeInRFC3339Nano return Clock current time in string

func (*ClockType) GetUTCNow

func (c *ClockType) GetUTCNow() (t time.Time)

GetUTCNow return Clock current time.Time

func (*ClockType) SetupInterval

func (c *ClockType) SetupInterval(interval time.Duration)

SetupInterval setup update interval

type CompressOptFunc added in v1.10.0

type CompressOptFunc func(*compressOption) error

CompressOptFunc options for compressor

func WithCompressBufSizeByte added in v1.10.0

func WithCompressBufSizeByte(n int) CompressOptFunc

WithCompressBufSizeByte set compressor buf size

func WithCompressLevel added in v1.10.0

func WithCompressLevel(n int) CompressOptFunc

WithCompressLevel set compressor compress level

func WithPGzipBlockSize added in v1.10.0

func WithPGzipBlockSize(bytes int) CompressOptFunc

WithPGzipBlockSize set compressor blocks

func WithPGzipNBlocks added in v1.10.0

func WithPGzipNBlocks(nBlock int) CompressOptFunc

WithPGzipNBlocks set compressor blocks

type CompressorItf added in v1.10.0

type CompressorItf interface {
	Write([]byte) (int, error)
	WriteString(string) (int, error)
	// write footer and flust to lower writer
	Flush() error
	// write footer without flush
	WriteFooter() error
}

CompressorItf interface of compressor

type Config

type Config struct {
	Name     string          `json:"name"`
	Profiles []string        `json:"profiles"`
	Label    string          `json:"label"`
	Version  string          `json:"version"`
	Sources  []*ConfigSource `json:"propertySources"`
}

Config whole configuation return by config-server

type ConfigSource

type ConfigSource struct {
	Name   string                 `json:"name"`
	Source map[string]interface{} `json:"source"`
}

ConfigSource config item in config-server

type ConfigSrv

type ConfigSrv struct {
	RemoteCfg *Config
	// contains filtered or unexported fields
}

ConfigSrv can load configuration from Spring-Cloud-Config-Server

Example
var (
	url     = "http://config-server.un.org"
	app     = "appname"
	profile = "sit"
	label   = "master"
)

c := NewConfigSrv(url, app, profile, label)
c.Get("management.context-path")
c.GetString("management.context-path")
c.GetBool("endpoints.health.sensitive")
c.GetInt("spring.cloud.config.retry")
Output:

func NewConfigSrv

func NewConfigSrv(url, app, profile, label string) *ConfigSrv

NewConfigSrv create ConfigSrv

func (*ConfigSrv) Fetch

func (c *ConfigSrv) Fetch() error

Fetch load data from config-server

func (*ConfigSrv) Get

func (c *ConfigSrv) Get(name string) (interface{}, bool)

Get get `interface{}` from the localcache of config-server

func (*ConfigSrv) GetBool

func (c *ConfigSrv) GetBool(name string) (val bool, ok bool)

GetBool get `bool` from the localcache of config-server

func (*ConfigSrv) GetInt

func (c *ConfigSrv) GetInt(name string) (val int, ok bool)

GetInt get `int` from the localcache of config-server

func (*ConfigSrv) GetString

func (c *ConfigSrv) GetString(name string) (string, bool)

GetString get `string` from the localcache of config-server

func (*ConfigSrv) Map

func (c *ConfigSrv) Map(set func(string, interface{}))

Map interate `set(k, v)`

type Counter

type Counter struct {
	sync.Mutex
	// contains filtered or unexported fields
}

Counter int64 counter

Example
package main

import (
	utils "github.com/Laisky/go-utils"
)

func main() {
	counter := utils.NewCounter()
	counter.Count()
	counter.CountN(10)
	counter.Get() // get current count
}
Output:

func NewCounter

func NewCounter() *Counter

NewCounter create Counter from 0

func NewCounterFromN

func NewCounterFromN(n int64) *Counter

NewCounterFromN create Counter from custom number

func (*Counter) Count

func (c *Counter) Count() int64

Count increse and return the result

func (*Counter) CountN

func (c *Counter) CountN(n int64) int64

CountN increse N and return the result

func (*Counter) Get

func (c *Counter) Get() int64

Get return current counter's number

func (*Counter) GetSpeed

func (c *Counter) GetSpeed() (r float64)

GetSpeed return increasing speed from lastest invoke `GetSpeed`

func (*Counter) Set

func (c *Counter) Set(n int64)

Set overwrite the counter's number

type CtxKeyT added in v1.7.0

type CtxKeyT struct{}

CtxKeyT type of context key

type DivideJWT added in v1.5.0

type DivideJWT struct {
	// contains filtered or unexported fields
}

DivideJWT jwt utils to generate and validate token.

use seperate secret for each token

Example
jwt, err := NewDivideJWT()
if err != nil {
	Logger.Panic("try to init jwt got error", zap.Error(err))
}

// generate jwt token for user
// GenerateToken(userId string, expiresAt time.Time, payload map[string]interface{}) (tokenStr string, err error)
u := &jwtUser{secret: []byte("secret for this user")}
token, err := jwt.GenerateToken(u, time.Now().Add(7*24*time.Hour), map[string]interface{}{"display_name": "Laisky"})
if err != nil {
	Logger.Error("try to generate jwt token got error", zap.Error(err))
	return
}
fmt.Println("got token:", token)

// validate token
payload, err := jwt.Validate(u, token)
if err != nil {
	Logger.Error("token invalidate")
	// you can get the payload even the token is invalidate
	Logger.Info("got payload", zap.String("payload", fmt.Sprint(payload)))
	return
}
fmt.Printf("got payload from token: %+v\n", payload)
Output:

func NewDivideJWT added in v1.5.0

func NewDivideJWT(opts ...JWTOptFunc) (j *DivideJWT, err error)

NewDivideJWT create new JWT

func (*DivideJWT) GenerateToken added in v1.5.0

func (j *DivideJWT) GenerateToken(user JWTUserItf, expiresAt time.Time, payload map[string]interface{}) (tokenStr string, err error)

GenerateToken generate JWT token. do not use `expires_at` & `uid` as keys.

func (*DivideJWT) GetExpiresKey added in v1.10.0

func (j *DivideJWT) GetExpiresKey() string

GetExpiresKey get jwt expires key

func (*DivideJWT) GetSignMethod added in v1.10.0

func (j *DivideJWT) GetSignMethod() *jwt.SigningMethodHMAC

GetSignMethod get jwt sign method

func (*DivideJWT) GetUserIDKey added in v1.10.0

func (j *DivideJWT) GetUserIDKey() string

GetUserIDKey get jwt user id key

func (*DivideJWT) Validate added in v1.5.0

func (j *DivideJWT) Validate(user JWTUserItf, tokenStr string) (payload jwt.MapClaims, err error)

Validate validate the token and return the payload

if token is invalidate, err will not be nil.

func (*DivideJWT) VerifyAndReplaceExp added in v1.5.2

func (j *DivideJWT) VerifyAndReplaceExp(payload jwt.MapClaims) (err error)

VerifyAndReplaceExp check expires and replace expires to time.Time if validated

type GZCompressor added in v1.6.0

type GZCompressor struct {
	// contains filtered or unexported fields
}

GZCompressor compress by gz with buf

Example
originText := "fj2f32f9jp9wsif0weif20if320fi23if"
writer := &bytes.Buffer{}

var err error
// writer
c, err := NewGZCompressor(
	writer,
	WithCompressLevel(defaultGzCompressLevel),           // default
	WithCompressBufSizeByte(defaultCompressBufSizeByte), // default
)
if err != nil {
	Logger.Error("new compressor", zap.Error(err))
	return
}
if _, err = c.WriteString(originText); err != nil {
	Logger.Error("write string to compressor", zap.Error(err))
	return
}
if err = c.Flush(); err != nil {
	Logger.Error("flush compressor", zap.Error(err))
	return
}

// reader
var gz *gzip.Reader
if gz, err = gzip.NewReader(writer); err != nil {
	Logger.Error("new compressor", zap.Error(err))
	return
}

var bs []byte
if bs, err = ioutil.ReadAll(gz); err != nil {
	Logger.Error("read from compressor", zap.Error(err))
	return
}

got := string(bs)
if got != originText {
	Logger.Error("extract compressed text invalidate",
		zap.String("got", got),
		zap.ByteString("expect", bs))
	return
}
Output:

func NewGZCompressor added in v1.6.0

func NewGZCompressor(writer io.Writer, opts ...CompressOptFunc) (c *GZCompressor, err error)

NewGZCompressor create new GZCompressor

func (*GZCompressor) Flush added in v1.6.0

func (c *GZCompressor) Flush() (err error)

Flush flush buffer bytes into bottom writer with gz meta footer

func (*GZCompressor) Write added in v1.6.0

func (c *GZCompressor) Write(d []byte) (int, error)

Write write bytes via compressor

func (*GZCompressor) WriteFooter added in v1.6.2

func (c *GZCompressor) WriteFooter() (err error)

WriteFooter write gz footer

func (*GZCompressor) WriteString added in v1.6.0

func (c *GZCompressor) WriteString(d string) (int, error)

WriteString write string via compressor

type GcOptFunc added in v1.10.2

type GcOptFunc func(*gcOption) error

GcOptFunc option for GC utils

func WithGCMemLimitFilePath added in v1.10.2

func WithGCMemLimitFilePath(path string) GcOptFunc

WithGCMemLimitFilePath set memory limit file

func WithGCMemRatio added in v1.10.2

func WithGCMemRatio(ratio int) GcOptFunc

WithGCMemRatio set mem ratio trigger for GC

type Int64CounterItf added in v1.7.8

type Int64CounterItf interface {
	Count() int64
	CountN(n int64) int64
}

Int64CounterItf counter for int64

type JWT

type JWT struct {
	// contains filtered or unexported fields
}

JWT struct to generate and validate jwt tokens

use a global uniform secret to signing all token.

Example
jwt, err := NewJWT([]byte("your secret key"))
if err != nil {
	Logger.Panic("try to init jwt got error", zap.Error(err))
}

// generate jwt token for user
// GenerateToken(userId string, expiresAt time.Time, payload map[string]interface{}) (tokenStr string, err error)
token, err := jwt.GenerateToken("laisky", time.Now().Add(7*24*time.Hour), map[string]interface{}{"display_name": "Laisky"})
if err != nil {
	Logger.Error("try to generate jwt token got error", zap.Error(err))
	return
}
fmt.Println("got token:", token)

// validate token
payload, err := jwt.Validate(token)
if err != nil {
	Logger.Error("token invalidate")
	return
}
fmt.Printf("got payload from token: %+v\n", payload)
Output:

func NewJWT added in v1.3.3

func NewJWT(secret []byte, opts ...JWTOptFunc) (j *JWT, err error)

NewJWT create new JWT

func (*JWT) GenerateToken added in v1.2.0

func (j *JWT) GenerateToken(userID interface{}, expiresAt time.Time, payload map[string]interface{}) (tokenStr string, err error)

GenerateToken generate JWT token with userID(interface{})

func (*JWT) GetExpiresKey added in v1.10.0

func (j *JWT) GetExpiresKey() string

GetExpiresKey get jwt expires key

func (*JWT) GetSignMethod added in v1.10.0

func (j *JWT) GetSignMethod() *jwt.SigningMethodHMAC

GetSignMethod get jwt sign method

func (*JWT) GetUserIDKey added in v1.10.0

func (j *JWT) GetUserIDKey() string

GetUserIDKey get jwt user id key

func (*JWT) Validate

func (j *JWT) Validate(tokenStr string) (payload jwt.MapClaims, err error)

Validate validate the token and return the payload

if token is invalidate, err will not be nil.

func (*JWT) VerifyAndReplaceExp added in v1.5.2

func (j *JWT) VerifyAndReplaceExp(payload map[string]interface{}) (err error)

VerifyAndReplaceExp check expires and replace expires to time.Time if validated

type JWTOptFunc added in v1.10.0

type JWTOptFunc func(*jwtOption) error

JWTOptFunc jwt option

func WithJWTExpiresKey added in v1.10.0

func WithJWTExpiresKey(expiresKey string) JWTOptFunc

WithJWTExpiresKey set jwt expires key in payload

func WithJWTSignMethod added in v1.10.0

func WithJWTSignMethod(method *jwt.SigningMethodHMAC) JWTOptFunc

WithJWTSignMethod set jwt sign method

func WithJWTUserIDKey added in v1.10.0

func WithJWTUserIDKey(userIDKey string) JWTOptFunc

WithJWTUserIDKey set jwt user id key in payload

type JWTUserItf added in v1.10.0

type JWTUserItf interface {
	GetUID() interface{}
	GetSecret() []byte
}

JWTUserItf load secret by uid

type LaiskyRemoteLock added in v1.10.0

type LaiskyRemoteLock struct {
	// contains filtered or unexported fields
}

LaiskyRemoteLock acquire lock from Laisky's GraphQL API

Example
cli, err := utils.NewLaiskyRemoteLock(
	"https://blog.laisky.com/graphql/query/",
	"eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NzYxMzQxMDAsInVpZCI6ImxhaXNreSJ9.r9YTtrU7RO0qMDKA8rAYXI0bzya9JYGam1l-dFxnHOAYD9qXhYXfubUfi_yo5LgDBBOON9XSkl2kIGrqqQWlyA",
)
if err != nil {
	utils.Logger.Error("create laisky lock", zap.Error(err))
}

var (
	ok          bool
	lockName    = "laisky.test"
	ctx, cancel = context.WithCancel(context.Background())
)
defer cancel()
if ok, err = cli.AcquireLock(
	ctx,
	lockName,
	utils.WithAcquireLockDuration(10*time.Second),
	utils.WithAcquireLockIsRenewal(true),
); err != nil {
	utils.Logger.Error("acquire lock", zap.String("lock_name", lockName))
}

if ok {
	utils.Logger.Info("success acquired lock")
} else {
	utils.Logger.Info("do not acquired lock")
	return
}

time.Sleep(3 * time.Second) // will auto renewal lock in background
Output:

func NewLaiskyRemoteLock added in v1.10.0

func NewLaiskyRemoteLock(api, token string, opts ...LaiskyRemoteLockOptFunc) (l *LaiskyRemoteLock, err error)

NewLaiskyRemoteLock create remote lock

func (*LaiskyRemoteLock) AcquireLock added in v1.10.0

func (l *LaiskyRemoteLock) AcquireLock(ctx context.Context, lockName string, opts ...AcquireLockOptFunc) (ok bool, err error)

AcquireLock acquire lock with lockname, if `isRenewal=true`, will automate refresh lock's lease until ctx done. duration to specify how much time each renewal will extend.

type LaiskyRemoteLockOptFunc added in v1.10.0

type LaiskyRemoteLockOptFunc func(*LaiskyRemoteLock) error

LaiskyRemoteLockOptFunc laisky's lock option

func WithLaiskyRemoteLockTimeout added in v1.10.0

func WithLaiskyRemoteLockTimeout(timeout time.Duration) LaiskyRemoteLockOptFunc

WithLaiskyRemoteLockTimeout set http client timeout

type LoggerType

type LoggerType struct {
	*zap.Logger
	// contains filtered or unexported fields
}

LoggerType extend from zap.Logger

var (
	/*Logger logging tool.

	* Info(msg string, fields ...Field)
	* Debug(msg string, fields ...Field)
	* Warn(msg string, fields ...Field)
	* Error(msg string, fields ...Field)
	* Panic(msg string, fields ...Field)
	* DebugSample(sample int, msg string, fields ...zapcore.Field)
	* InfoSample(sample int, msg string, fields ...zapcore.Field)
	* WarnSample(sample int, msg string, fields ...zapcore.Field)
	 */
	Logger *LoggerType
)

func CreateNewDefaultLogger added in v1.10.1

func CreateNewDefaultLogger(name, level string, opts ...zap.Option) (l *LoggerType, err error)

CreateNewDefaultLogger set default utils.Logger

func NewLogger added in v1.8.0

func NewLogger(level string, opts ...zap.Option) (l *LoggerType, err error)

NewLogger create new logger

func NewLoggerWithName added in v1.9.0

func NewLoggerWithName(name, level string, opts ...zap.Option) (l *LoggerType, err error)

NewLoggerWithName create new logger with name

func (*LoggerType) ChangeLevel added in v1.8.0

func (l *LoggerType) ChangeLevel(level string) (err error)

ChangeLevel change logger level

func (*LoggerType) Clone added in v1.10.1

func (l *LoggerType) Clone() *LoggerType

Clone clone new Logger that inherit all config

func (*LoggerType) DebugSample

func (l *LoggerType) DebugSample(sample int, msg string, fields ...zapcore.Field)

DebugSample emit debug log with propability sample/SampleRateDenominator. sample could be [0, 1000], less than 0 means never, great than 1000 means certainly

func (*LoggerType) InfoSample

func (l *LoggerType) InfoSample(sample int, msg string, fields ...zapcore.Field)

InfoSample emit info log with propability sample/SampleRateDenominator

func (*LoggerType) Named added in v1.10.1

func (l *LoggerType) Named(s string) *LoggerType

Named adds a new path segment to the logger's name. Segments are joined by periods. By default, Loggers are unnamed.

func (*LoggerType) WarnSample

func (l *LoggerType) WarnSample(sample int, msg string, fields ...zapcore.Field)

WarnSample emit warn log with propability sample/SampleRateDenominator

func (*LoggerType) With added in v1.9.4

func (l *LoggerType) With(fields ...zapcore.Field) *LoggerType

With creates a child logger and adds structured context to it. Fields added to the child don't affect the parent, and vice versa.

func (*LoggerType) WithOptions added in v1.9.4

func (l *LoggerType) WithOptions(opts ...zap.Option) *LoggerType

WithOptions clones the current Logger, applies the supplied Options, and returns the resulting Logger. It's safe to use concurrently.

type Mail

type Mail struct {
	// contains filtered or unexported fields
}

Mail easy way to send basic email

Example
sender := utils.NewMail("smtp_host", 53)
if err := sender.Send(
	"fromAddr",
	"toAddr",
	"frName",
	"toName",
	"Title",
	"Content",
); err != nil {
	utils.Logger.Error("try to send email got error", zap.Error(err))
}
Output:

func NewMail

func NewMail(host string, port int) *Mail

NewMail create Mail with SMTP host and port

func (*Mail) BuildMessage

func (m *Mail) BuildMessage(msg string) string

BuildMessage implement

func (*Mail) Login

func (m *Mail) Login(username, password string)

Login login to SMTP server

func (*Mail) Send

func (m *Mail) Send(frAddr, toAddr, frName, toName, subject, content string) (err error)

Send send email

type Mutex added in v1.3.7

type Mutex struct {
	// contains filtered or unexported fields
}

Mutex mutex that support unblocking lock

Example
l := utils.NewMutex()
if !l.TryLock() {
	utils.Logger.Info("can not acquire lock")
	return
}
defer l.ForceRelease()
Output:

func NewMutex added in v1.3.7

func NewMutex() *Mutex

NewMutex create new mutex

func (*Mutex) ForceRelease added in v1.7.5

func (m *Mutex) ForceRelease()

ForceRelease force release lock

func (*Mutex) IsLocked added in v1.3.7

func (m *Mutex) IsLocked() bool

IsLocked return true if is locked

func (*Mutex) SpinLock added in v1.3.7

func (m *Mutex) SpinLock(step, timeout time.Duration)

SpinLock block until succee acquired lock

func (*Mutex) TryLock added in v1.3.7

func (m *Mutex) TryLock() bool

TryLock return true if succeed locked

func (*Mutex) TryRelease added in v1.3.7

func (m *Mutex) TryRelease() bool

TryRelease return true if succeed release

type PGZCompressor added in v1.10.0

type PGZCompressor struct {
	// contains filtered or unexported fields
}

PGZCompressor compress by gz with buf

Example
originText := "fj2f32f9jp9wsif0weif20if320fi23if"
writer := &bytes.Buffer{}

var err error
// writer
c, err := NewPGZCompressor(writer)
if err != nil {
	Logger.Error("new compressor", zap.Error(err))
	return
}
if _, err = c.WriteString(originText); err != nil {
	Logger.Error("write string to compressor", zap.Error(err))
	return
}
if err = c.Flush(); err != nil {
	Logger.Error("flush compressor", zap.Error(err))
	return
}

// reader
var gz *gzip.Reader
if gz, err = gzip.NewReader(writer); err != nil {
	Logger.Error("new compressor", zap.Error(err))
	return
}

var bs []byte
if bs, err = ioutil.ReadAll(gz); err != nil {
	Logger.Error("read from compressor", zap.Error(err))
	return
}

got := string(bs)
if got != originText {
	Logger.Error("extract compressed text invalidate",
		zap.String("got", got),
		zap.ByteString("expect", bs))
	return
}
Output:

func NewPGZCompressor added in v1.10.0

func NewPGZCompressor(writer io.Writer, opts ...CompressOptFunc) (c *PGZCompressor, err error)

NewPGZCompressor create new PGZCompressor

func (*PGZCompressor) Flush added in v1.10.0

func (c *PGZCompressor) Flush() (err error)

Flush flush buffer bytes into bottom writer with gz meta footer

func (*PGZCompressor) Write added in v1.10.0

func (c *PGZCompressor) Write(d []byte) (int, error)

Write write bytes via compressor

func (*PGZCompressor) WriteFooter added in v1.10.0

func (c *PGZCompressor) WriteFooter() (err error)

WriteFooter write gz footer

func (*PGZCompressor) WriteString added in v1.10.0

func (c *PGZCompressor) WriteString(d string) (int, error)

WriteString write string via compressor

type PairList

type PairList []SortItemItf

PairList array of sort items

func SortBiggest

func SortBiggest(items PairList) PairList

SortBiggest sort from biggest to smallest

func SortSmallest

func SortSmallest(items PairList) PairList

SortSmallest sort from smallest to biggest

func (PairList) Len

func (p PairList) Len() int

Len return length of sort items

func (PairList) Less

func (p PairList) Less(i, j int) bool

Less compare two items

func (PairList) Swap

func (p PairList) Swap(i, j int)

Swap change two items

type ParallelCounter added in v1.6.3

type ParallelCounter struct {
	sync.Mutex
	// contains filtered or unexported fields
}

ParallelCounter parallel count with child counter

func NewParallelCounter added in v1.6.3

func NewParallelCounter(quoteStep, rotatePoint int64) (*ParallelCounter, error)

NewParallelCounter get new parallel counter

func NewParallelCounterFromN added in v1.6.3

func NewParallelCounterFromN(n, quoteStep, rotatePoint int64) (*ParallelCounter, error)

NewParallelCounterFromN get new parallel counter

func (*ParallelCounter) GetChild added in v1.6.3

func (c *ParallelCounter) GetChild() *ChildParallelCounter

GetChild create new child

func (*ParallelCounter) GetQuote added in v1.6.3

func (c *ParallelCounter) GetQuote(step int64) (from, to int64)

GetQuote child request new quote from parent

type PateoAlertPusher added in v1.10.1

type PateoAlertPusher struct {
	// contains filtered or unexported fields
}

PateoAlertPusher alert pusher for pateo wechat service

func NewPateoAlertPusher added in v1.10.1

func NewPateoAlertPusher(ctx context.Context, api, token string, opts ...AlertHookOptFunc) (p *PateoAlertPusher, err error)

NewPateoAlertPusher create new PateoAlertPusher

func (*PateoAlertPusher) GetZapHook added in v1.10.1

func (p *PateoAlertPusher) GetZapHook() func(zapcore.Entry, []zapcore.Field) (err error)

GetZapHook get hook for zap logger

func (*PateoAlertPusher) Send added in v1.10.1

func (p *PateoAlertPusher) Send(title, content string, ts time.Time) (err error)

Send send alert msg

type RequestData

type RequestData struct {
	Headers map[string]string
	Data    interface{}
}

RequestData 发起请求的结构体

type RotateCounter

type RotateCounter struct {
	Mutex
	// contains filtered or unexported fields
}

RotateCounter rotate counter

Example
package main

import (
	utils "github.com/Laisky/go-utils"
)

func main() {
	counter, err := utils.NewRotateCounter(10)
	if err != nil {
		panic(err)
	}

	counter.Count()    // 1
	counter.CountN(10) // 1
}
Output:

func NewRotateCounter

func NewRotateCounter(rotatePoint int64) (*RotateCounter, error)

NewRotateCounter create new RotateCounter with threshold from 0

func NewRotateCounterFromN

func NewRotateCounterFromN(n, rotatePoint int64) (*RotateCounter, error)

NewRotateCounterFromN create new RotateCounter with threshold from N

func NewRotateCounterFromNWithCtx added in v1.7.5

func NewRotateCounterFromNWithCtx(ctx context.Context, n, rotatePoint int64) (*RotateCounter, error)

NewRotateCounterFromNWithCtx create new RotateCounter with threshold from N

func NewRotateCounterWithCtx added in v1.7.5

func NewRotateCounterWithCtx(ctx context.Context, rotatePoint int64) (*RotateCounter, error)

NewRotateCounterWithCtx create new RotateCounter with threshold from 0

func (*RotateCounter) Close added in v1.7.5

func (c *RotateCounter) Close()

Close stop rorate runner

func (*RotateCounter) Count

func (c *RotateCounter) Count() int64

Count increse and return the result

func (*RotateCounter) CountN

func (c *RotateCounter) CountN(n int64) (r int64)

CountN increse N and return the result

func (*RotateCounter) Get added in v1.7.8

func (c *RotateCounter) Get() int64

Get return current counter's number

type SettingsType

type SettingsType struct {
	sync.RWMutex
	YamlExt string
}

SettingsType type of project settings

func (*SettingsType) BindPFlags

func (s *SettingsType) BindPFlags(p *pflag.FlagSet) error

BindPFlags bind pflags to settings

func (*SettingsType) Get

func (s *SettingsType) Get(key string) interface{}

Get get setting by key

func (*SettingsType) GetBool

func (s *SettingsType) GetBool(key string) bool

GetBool get setting by key

func (*SettingsType) GetDuration

func (s *SettingsType) GetDuration(key string) time.Duration

GetDuration get setting by key

func (*SettingsType) GetInt

func (s *SettingsType) GetInt(key string) int

GetInt get setting by key

func (*SettingsType) GetInt64

func (s *SettingsType) GetInt64(key string) int64

GetInt64 get setting by key

func (*SettingsType) GetString

func (s *SettingsType) GetString(key string) string

GetString get setting by key

func (*SettingsType) GetStringMap added in v1.5.4

func (s *SettingsType) GetStringMap(key string) map[string]interface{}

GetStringMap return map contains interface

func (*SettingsType) GetStringMapString added in v1.5.4

func (s *SettingsType) GetStringMapString(key string) map[string]string

GetStringMapString return map contains strings

func (*SettingsType) GetStringSlice

func (s *SettingsType) GetStringSlice(key string) []string

GetStringSlice get setting by key

func (*SettingsType) IsSet added in v1.5.4

func (s *SettingsType) IsSet(key string) bool

IsSet check whether exists

func (*SettingsType) LoadSettings

func (s *SettingsType) LoadSettings()

LoadSettings load settings file

func (*SettingsType) Set

func (s *SettingsType) Set(key string, val interface{})

Set set setting by key

func (*SettingsType) Setup

func (s *SettingsType) Setup(configPath string) error

Setup load config file settings.yml

func (*SettingsType) SetupFromConfigServer

func (s *SettingsType) SetupFromConfigServer(url, app, profile, label string) (err error)

SetupFromConfigServer load configs from config-server, endpoint `{url}/{app}/{profile}/{label}`

func (*SettingsType) SetupFromConfigServerWithRawYaml

func (s *SettingsType) SetupFromConfigServerWithRawYaml(url, app, profile, label, key string) (err error)

SetupFromConfigServerWithRawYaml load configs from config-server

endpoint `{url}/{app}/{profile}/{label}`

load raw yaml content and parse.

func (*SettingsType) SetupFromDir

func (s *SettingsType) SetupFromDir(dirPath string) error

SetupFromDir load settings from dir, default fname is `settings.yml`

func (*SettingsType) SetupFromFile

func (s *SettingsType) SetupFromFile(filePath string) error

SetupFromFile load settings from file

type SortItemItf

type SortItemItf interface {
	GetValue() int
	GetKey() interface{}
}

SortItemItf interface of sort item

type Throttle

type Throttle struct {
	*ThrottleCfg
	// contains filtered or unexported fields
}

Throttle current limitor

Example
ctx := context.Background()
throttle, err := utils.NewThrottleWithCtx(ctx, &utils.ThrottleCfg{
	NPerSec: 10,
	Max:     100,
})
if err != nil {
	utils.Logger.Panic("new throttle")
}
defer throttle.Close()

inChan := make(chan int)

for msg := range inChan {
	if !throttle.Allow() {
		continue
	}

	// do something with msg
	fmt.Println(msg)
}
Output:

func NewThrottleWithCtx added in v1.9.0

func NewThrottleWithCtx(ctx context.Context, cfg *ThrottleCfg) (t *Throttle, err error)

NewThrottleWithCtx create new Throttle

func (*Throttle) Allow

func (t *Throttle) Allow() bool

Allow check whether is allowed

func (*Throttle) Close added in v1.9.0

func (t *Throttle) Close()

Close stop throttle

func (*Throttle) Stop

func (t *Throttle) Stop()

Stop stop throttle

type ThrottleCfg

type ThrottleCfg struct {
	Max, NPerSec int
}

ThrottleCfg Throttle's configuration

type Uint32Counter

type Uint32Counter struct {
	// contains filtered or unexported fields
}

Uint32Counter uint32 counter

func NewUint32Counter

func NewUint32Counter() *Uint32Counter

NewUint32Counter return new Uint32Counter from 0

func NewUint32CounterFromN

func NewUint32CounterFromN(n uint32) *Uint32Counter

NewUint32CounterFromN return new Uint32Counter from n

func (*Uint32Counter) Count

func (c *Uint32Counter) Count() uint32

Count increse and return the result

func (*Uint32Counter) CountN

func (c *Uint32Counter) CountN(n uint32) uint32

CountN increse N and return the result

func (*Uint32Counter) Get

func (c *Uint32Counter) Get() uint32

Get return current counter's number

func (*Uint32Counter) Set

func (c *Uint32Counter) Set(n uint32)

Set overwrite the counter's number

Directories

Path Synopsis
Package consistenthash contains some implementation of consistent hashing.
Package consistenthash contains some implementation of consistent hashing.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL