utils

package module
v0.0.0-...-abab17c Latest Latest
Warning

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

Go to latest
Published: May 15, 2025 License: MIT Imports: 34 Imported by: 0

README

Go-Utils

Go 常用的助手函数, 0 依赖, 性能至上.

若有直接引用的, 会在函数定义或目录 README 中注明来源, 并保留 LICENSE, 感谢之!

安装

go get github.com/shoddybutter/utils

目录

常用函数
DOC
package utils // import "github.com/shoddybutter/utils"

const Byte = 1 << (iota * 10) ...
const IByte = 1 ...
const IPv4Min = 0 ...
const PtrSize = 4 << (^uintptr(0) >> 63)
var BigByte ...
var BigSIByte ...
var Rand = NewRand() ...
var ErrInvalidHostPort = errors.New("invalid Host or Port")
var StackTraceBufferSize = 4 << 10
func B2S(b []byte) string
func B64Decode(s string) []byte
func B64Encode(b []byte) string
func B64UrlDecode(s string) []byte
func B64UrlEncode(b []byte) string
func BeginOfDay(t time.Time) time.Time
func BeginOfHour(t time.Time) time.Time
func BeginOfLastMonth(t time.Time) time.Time
func BeginOfLastWeek(t time.Time) time.Time
func BeginOfMinute(t time.Time) time.Time
func BeginOfMonth(t time.Time) time.Time
func BeginOfNextMonth(t time.Time) time.Time
func BeginOfNextWeek(t time.Time) time.Time
func BeginOfSecond(t time.Time) time.Time
func BeginOfTomorrow(t time.Time) time.Time
func BeginOfWeek(t time.Time) time.Time
func BeginOfYear(t time.Time) time.Time
func BeginOfYesterday(t time.Time) time.Time
func BigComma(b *big.Int) string
func BigCommaf(v *big.Float) string
func Bigoom(n, b *big.Int) (float64, int)
func CPUTicks() int64
func CallPath() string
func Comma(v int64) string
func Commaf(v float64) string
func Commai(v int) string
func Commau(v uint64) string
func CopyB2S(b []byte) string
func CopyBytes(b []byte) []byte
func CopyS2B(s string) []byte
func CopyString(s string) string
func CutBytes(s, sep []byte) (before, after []byte, found bool)
func CutString(s, sep string) (before, after string, found bool)
func DaysInMonth(year int, m time.Month) int
func DaysInYear(year int) int
func EncodeUUID(id []byte) []byte
func EndOfDay(t time.Time) time.Time
func EndOfHour(t time.Time) time.Time
func EndOfLastMonth(t time.Time) time.Time
func EndOfLastWeek(t time.Time) time.Time
func EndOfMinute(t time.Time) time.Time
func EndOfMonth(t time.Time) time.Time
func EndOfNextMonth(t time.Time) time.Time
func EndOfNextWeek(t time.Time) time.Time
func EndOfSecond(t time.Time) time.Time
func EndOfTomorrow(t time.Time) time.Time
func EndOfWeek(t time.Time) time.Time
func EndOfYear(t time.Time) time.Time
func EndOfYesterday(t time.Time) time.Time
func EqualFold(b, s string) bool
func EqualFoldBytes(b, s []byte) bool
func Executable(evalSymlinks ...bool) string
func ExecutableDir(evalSymlinks ...bool) string
func FastIntn(n int) int
func FastRand() uint32
func FastRand64() uint64
func FastRandn(n uint32) uint32
func FastRandu() uint
func GetBytes(v interface{}, defaultVal ...[]byte) []byte
func GetIPPort(addr net.Addr) (ip net.IP, port int, err error)
func GetInt(v interface{}, defaultInt ...int) int
func GetMonthDays(t time.Time) int
func GetNotInternalIPv4(ip, defaultIP net.IP, flag ...bool) net.IP
func GetNotInternalIPv4String(ip, defaultIP string, flag ...bool) string
func GetSafeB2S(b []byte, defaultVal ...string) string
func GetSafeBytes(b []byte, defaultVal ...[]byte) []byte
func GetSafeS2B(s string, defaultVal ...[]byte) []byte
func GetSafeString(s string, defaultVal ...string) string
func GetString(v interface{}, defaultVal ...string) string
func GoroutineID() (uint64, error)
func Gzip(data []byte) ([]byte, error)
func GzipLevel(data []byte, level int) (dst []byte, err error)
func HumanBaseBytes(v uint64, base float64, sizes []string) string
func HumanBigBytes(s *big.Int) string
func HumanBigIBytes(s *big.Int) string
func HumanBigKbps(s *big.Int) string
func HumanBytes(v uint64) string
func HumanGBMB(v uint64) string
func HumanIBytes(v uint64) string
func HumanIntBytes(v int) string
func HumanIntIBytes(v int) string
func HumanIntKbps(v int) string
func HumanKbps(v uint64) string
func ID() uint64
func IPv42Long(ip net.IP) int
func IPv42LongLittle(ip net.IP) int
func IPv4String2Long(ip string) int
func IPv4String2LongLittle(ip string) int
func IPv62Int(ip net.IP) *big.Int
func IPv6String2Int(ip string) *big.Int
func InIPNet(ip net.IP, ipNets map[*net.IPNet]struct{}) bool
func InIPNetString(ip string, ipNets map[*net.IPNet]struct{}) bool
func InInts(slice []int, n int) bool
func InStrings(ss []string, s string) bool
func InitCSTLocation() (name string, loc *time.Location, cst *time.Location, ok bool)
func InitLocation(name string) (*time.Location, bool)
func Int2IPv6(ipInt *big.Int) net.IP
func Int2IPv6String(n *big.Int) string
func IsIP(ip string) bool
func IsIPv4(s string) bool
func IsIPv6(s string) bool
func IsInternalIPv4(ip net.IP) bool
func IsInternalIPv4String(ip string) bool
func IsLeapYear(year int) bool
func IsNumeric(s string) bool
func IsPrivateIP(ip net.IP) bool
func IsPrivateIPString(ip string) bool
func JoinBytes(b ...[]byte) []byte
func JoinString(s ...string) string
func JoinStringBytes(s ...string) []byte
func LeftPad(s, pad string, n int) string
func LeftPadBytes(b, pad []byte, n int) []byte
func Logn(n, b float64) float64
func Long2IPv4(n int) net.IP
func Long2IPv4String(n int) string
func LongLittle2IPv4(n int) net.IP
func LongLittle2IPv4String(n int) string
func MaxInt(a, b int) int
func MinInt(a, b int) int
func MustBool(v interface{}) bool
func MustInt(v interface{}) int
func MustJSON(v interface{}) []byte
func MustJSONIndent(v interface{}) []byte
func MustJSONIndentString(v interface{}) string
func MustJSONString(v interface{}) string
func MustParseHumanBigBytes(s string, defaultVal ...*big.Int) *big.Int
func MustParseHumanBytes(s string, defaultVal ...uint64) uint64
func MustString(v interface{}, timeLayout ...string) string
func NanoTime() int64
func NewRand(seed ...int64) *rand.Rand
func Pad(s, pad string, n int) string
func PadBytes(s, pad []byte, n int) []byte
func ParseHostPort(s string) (net.IP, uint16, bool, error)
func ParseHumanBigBytes(s string) (*big.Int, error)
func ParseHumanBytes(s string) (uint64, error)
func ParseIP(s string) (net.IP, bool)
func ParseIPv4(ip string) net.IP
func ParseIPv6(ip string) net.IP
func ParseIPx(s string) (net.IP, bool)
func ParseIPxWithNumeric(s string) (net.IP, bool)
func ParseInts(s string) ([]int, error)
func RandAlphaBytes(n int) []byte
func RandAlphaString(n int) string
func RandBytes(n int) []byte
func RandBytesLetters(n int, letters string) []byte
func RandDecBytes(n int) []byte
func RandDecString(n int) string
func RandHexBytes(n int) []byte
func RandHexString(n int) string
func RandInt(min, max int) int
func RandString(n int) string
func RandUint32(min, max uint32) uint32
func Recover(cb ...RecoveryCallback)
func RemoveString(ss []string, s string) ([]string, bool)
func ReplaceHost(a, b string) string
func Reverse(s string) string
func RightPad(s, pad string, n int) string
func RightPadBytes(b, pad []byte, n int) []byte
func Round(v float64, precision int) float64
func RunPath() string
func RuneReverse(s string) string
func RuneSubString(s string, length int, suffix string) string
func S2B(s string) []byte
func SafeGo(fn func(), cb ...RecoveryCallback)
func SafeGoCommonFunc(args interface{}, fn func(args interface{}), cb ...RecoveryCallback)
func SafeGoWithContext(ctx context.Context, fn func(ctx context.Context), cb ...RecoveryCallback)
func SearchInt(slice []int, n int) int
func SearchString(ss []string, s string) int
func Sleep(ctx context.Context, interval time.Duration) error
func SplitHostPort(hostPort string) (host, port string)
func SumInt(v ...int) int
func ToLower(b string) string
func ToLowerBytes(b []byte) []byte
func ToUpper(b string) string
func ToUpperBytes(b []byte) []byte
func Trim(s string, cutset byte) string
func TrimBytes(b []byte, cutset byte) []byte
func TrimLeft(s string, cutset byte) string
func TrimLeftBytes(b []byte, cutset byte) []byte
func TrimRight(s string, cutset byte) string
func TrimRightBytes(b []byte, cutset byte) []byte
func TrimSlice(ss []string) []string
func UUID() []byte
func UUIDShort() string
func UUIDSimple() string
func UUIDString() string
func Ungzip(data []byte) (src []byte, err error)
func Unzip(data []byte) (src []byte, err error)
func ValidOptionalPort(port string) bool
func WaitNextMinute(t ...time.Time)
func WaitNextMinuteWithTime(t ...time.Time) (now time.Time)
func WaitNextSecond(t ...time.Time)
func WaitNextSecondWithTime(t ...time.Time) (now time.Time)
func WaitSignal(sig ...os.Signal) os.Signal
func WaitUntilMinute(m int, t ...time.Time)
func WaitUntilSecond(s int, t ...time.Time)
func Zip(data []byte) ([]byte, error)
func ZipLevel(data []byte, level int) (dst []byte, err error)
type Bool struct{ ... }
    func NewBool(val bool) *Bool
    func NewFalse() *Bool
    func NewTrue() *Bool
type NoCmp [0]func()
type NoCopy struct{}
type RecoveryCallback func(err interface{}, trace []byte)
type TryMutex struct{ ... }
    func NewTryMutex() *TryMutex
泛型方法集

具体使用见各目录下的文档或测试

有序字典

见: orderedmap (@iancoleman)

A golang data type equivalent to python's collections.OrderedDict

支持 JSON 序列化, 键/值排序.

数据类型转换函数集

见: conv (@tidwall)

DOC
package conv // import "github.com/shoddybutter/utils/conv"

func Atof(a string) float64
func Atoi(a string) int64
func Atot(a string) bool
func Atou(a string) uint64
func Atov(a string) interface{}
func Ftoa(f float64) string
func Ftoi(f float64) int64
func Ftot(f float64) bool
func Ftou(f float64) uint64
func Ftov(f float64) interface{}
func Itoa(i int64) string
func Itof(i int64) float64
func Itot(i int64) bool
func Itou(i int64) uint64
func Itov(i int64) interface{}
func Ttoa(t bool) string
func Ttof(t bool) float64
func Ttoi(t bool) int64
func Ttou(t bool) uint64
func Ttov(t bool) interface{}
func Utoa(u uint64) string
func Utof(u uint64) float64
func Utoi(u uint64) int64
func Utot(u uint64) bool
func Utov(u uint64) interface{}
func Vtoa(v interface{}) string
func Vtof(v interface{}) float64
func Vtoi(v interface{}) int64
func Vtot(v interface{}) bool
func Vtou(v interface{}) uint64
type Value struct{ ... }
    func Any(v interface{}) Value
    func Bool(t bool) Value
    func Byte(x byte) Value
    func Bytes(b []byte) Value
    func CustomBits(x uint64) Value
    func Float32(x float32) Value
    func Float64(f float64) Value
    func Int(x int) Value
    func Int16(x int16) Value
    func Int32(x int32) Value
    func Int64(x int64) Value
    func Int8(x int8) Value
    func Nil() Value
    func String(s string) Value
    func StringWithTag(s string, tag uint16) Value
    func Uint(x uint) Value
    func Uint16(x uint16) Value
    func Uint32(x uint32) Value
    func Uint64(x uint64) Value
    func Uint8(x uint8) Value
加解密小工具

见: envtools

常用对称加解密函数

见: xcrypto

DOC
package xcrypto // import "github.com/shoddybutter/utils/xcrypto"

func AesCBCDeB58(s string, key []byte) []byte
func AesCBCDeB64(s string, key []byte) []byte
func AesCBCDeHex(s string, key []byte) []byte
func AesCBCDePKCS7B58(s string, key []byte) []byte
func AesCBCDePKCS7B64(s string, key []byte) []byte
func AesCBCDePKCS7Hex(s string, key []byte) []byte
func AesCBCDePKCS7StringB58(s string, key []byte) string
func AesCBCDePKCS7StringB64(s string, key []byte) string
func AesCBCDePKCS7StringHex(s string, key []byte) string
func AesCBCDeStringB58(s string, key []byte) string
func AesCBCDeStringB64(s string, key []byte) string
func AesCBCDeStringHex(s string, key []byte) string
func AesCBCDecrypt(asPKCS7 bool, ciphertext, key []byte, ivs ...[]byte) (plaintext []byte)
func AesCBCDecryptE(asPKCS7 bool, ciphertext, key []byte, ivs ...[]byte) ([]byte, error)
func AesCBCEnB58(b, key []byte) string
func AesCBCEnB64(b, key []byte) string
func AesCBCEnHex(b, key []byte) string
func AesCBCEnPKCS7B58(b, key []byte) string
func AesCBCEnPKCS7B64(b, key []byte) string
func AesCBCEnPKCS7Hex(b, key []byte) string
func AesCBCEnPKCS7StringB58(s string, key []byte) string
func AesCBCEnPKCS7StringB64(s string, key []byte) string
func AesCBCEnPKCS7StringHex(s string, key []byte) string
func AesCBCEnStringB58(s string, key []byte) string
func AesCBCEnStringB64(s string, key []byte) string
func AesCBCEnStringHex(s string, key []byte) string
func AesCBCEncrypt(asPKCS7 bool, plaintext, key []byte, ivs ...[]byte) (ciphertext []byte)
func AesCBCEncryptE(asPKCS7 bool, plaintext, key []byte, ivs ...[]byte) ([]byte, error)
func AesGCMDeB58(s string, key, nonce []byte) []byte
func AesGCMDeB64(s string, key, nonce []byte) []byte
func AesGCMDeHex(s string, key, nonce []byte) []byte
func AesGCMDeStringB58(s string, key, nonce []byte) string
func AesGCMDeStringB64(s string, key, nonce []byte) string
func AesGCMDeStringHex(s string, key, nonce []byte) string
func AesGCMDecrypt(ciphertext, key, nonce []byte) (plaintext []byte)
func AesGCMDecryptWithNonce(ciphertext, key, nonce, additionalData []byte) ([]byte, error)
func AesGCMEnB58(b, key []byte) (string, []byte)
func AesGCMEnB64(b, key []byte) (string, []byte)
func AesGCMEnHex(b, key []byte) (string, []byte)
func AesGCMEnStringB58(s string, key []byte) (string, []byte)
func AesGCMEnStringB64(s string, key []byte) (string, []byte)
func AesGCMEnStringHex(s string, key []byte) (string, []byte)
func AesGCMEncrypt(plaintext, key []byte) (ciphertext []byte, nonce []byte)
func AesGCMEncryptWithNonce(plaintext, key, nonce, additionalData []byte) ([]byte, []byte, error)
func Decrypt(value, secret string) string
func DesCBCDeB58(s string, key []byte) []byte
func DesCBCDeB64(s string, key []byte) []byte
func DesCBCDeHex(s string, key []byte) []byte
func DesCBCDePKCS7B58(s string, key []byte) []byte
func DesCBCDePKCS7B64(s string, key []byte) []byte
func DesCBCDePKCS7Hex(s string, key []byte) []byte
func DesCBCDePKCS7StringB58(s string, key []byte) string
func DesCBCDePKCS7StringB64(s string, key []byte) string
func DesCBCDePKCS7StringHex(s string, key []byte) string
func DesCBCDeStringB58(s string, key []byte) string
func DesCBCDeStringB64(s string, key []byte) string
func DesCBCDeStringHex(s string, key []byte) string
func DesCBCDecrypt(asPKCS7 bool, ciphertext, key []byte, ivs ...[]byte) (plaintext []byte)
func DesCBCDecryptE(asPKCS7 bool, ciphertext, key []byte, ivs ...[]byte) ([]byte, error)
func DesCBCEnB58(b, key []byte) string
func DesCBCEnB64(b, key []byte) string
func DesCBCEnHex(b, key []byte) string
func DesCBCEnPKCS7B58(b, key []byte) string
func DesCBCEnPKCS7B64(b, key []byte) string
func DesCBCEnPKCS7Hex(b, key []byte) string
func DesCBCEnPKCS7StringB58(s string, key []byte) string
func DesCBCEnPKCS7StringB64(s string, key []byte) string
func DesCBCEnPKCS7StringHex(s string, key []byte) string
func DesCBCEnStringB58(s string, key []byte) string
func DesCBCEnStringB64(s string, key []byte) string
func DesCBCEnStringHex(s string, key []byte) string
func DesCBCEncrypt(asPKCS7 bool, plaintext, key []byte, ivs ...[]byte) (ciphertext []byte)
func DesCBCEncryptE(asPKCS7 bool, plaintext, key []byte, ivs ...[]byte) ([]byte, error)
func Encrypt(value, secret string) string
func GCMDeB58(s string, key []byte) []byte
func GCMDeB64(s string, key []byte) []byte
func GCMDeHex(s string, key []byte) []byte
func GCMDeStringB58(s string, key []byte) string
func GCMDeStringB64(s string, key []byte) string
func GCMDeStringHex(s string, key []byte) string
func GCMDecrypt(encrypted, key []byte) ([]byte, error)
func GCMEnB58(b, key []byte) string
func GCMEnB64(b, key []byte) string
func GCMEnHex(b, key []byte) string
func GCMEnStringB58(s string, key []byte) string
func GCMEnStringB64(s string, key []byte) string
func GCMEnStringHex(s string, key []byte) string
func GCMEncrypt(plaintext, key []byte) ([]byte, error)
func GenRSAKey(bits int) (publicKey, privateKey []byte)
func GetenvDecrypt(key string, secret string) string
func Padding(b []byte, bSize int, pkcs7 bool) []byte
func ParsePrivateKey(privateKey []byte) (priv *rsa.PrivateKey, err error)
func ParsePublicKey(publicKey []byte) (pub *rsa.PublicKey, err error)
func RSADecrypt(ciphertext, privateKey []byte) ([]byte, error)
func RSAEncrypt(plaintext, publicKey []byte) ([]byte, error)
func RSASign(data, privateKey []byte) ([]byte, error)
func RSASignVerify(data, publicKey, sig []byte) error
func SetenvEncrypt(key, value, secret string) (string, error)
func UnPadding(b []byte, pkcs7 bool) []byte
func XOR(src, key []byte) []byte
func XORDeB58(s string, key []byte) []byte
func XORDeB64(s string, key []byte) []byte
func XORDeHex(s string, key []byte) []byte
func XORDeStringB58(s string, key []byte) string
func XORDeStringB64(s string, key []byte) string
func XORDeStringHex(s string, key []byte) string
func XORE(src, key []byte) ([]byte, error)
func XOREnB58(b, key []byte) string
func XOREnB64(b, key []byte) string
func XOREnHex(b, key []byte) string
func XOREnStringB58(s string, key []byte) string
func XOREnStringB64(s string, key []byte) string
func XOREnStringHex(s string, key []byte) string
获取内外网 IP 小工具

见: myip

或: https://github.com/fufuok/myip

DOC
package myip // import "github.com/shoddybutter/utils/myip"

func ExternalIP(v ...string) string
func ExternalIPAny(retries ...int) string
func ExternalIPv4() string
func ExternalIPv6() string
func InterfaceAddrs(v ...string) (map[string][]net.IP, error)
func InternalIP(dstAddr, network string) string
func InternalIPv4() string
func InternalIPv6() string
func LocalIP() string
func LocalIPv4s() (ips []string)
编码解码 base62

见: base62 (@jxskiss)

或: https://github.com/fufuok/basex

DOC
package base62 // import "github.com/shoddybutter/utils/base62"

var StdEncoding = NewEncoding(encodeStd)
func AppendInt(dst []byte, num int64) []byte
func AppendUint(dst []byte, num uint64) []byte
func Decode(src []byte) ([]byte, error)
func DecodeString(src string) ([]byte, error)
func DecodeToBuf(dst []byte, src []byte) ([]byte, error)
func Encode(src []byte) []byte
func EncodeToBuf(dst []byte, src []byte) []byte
func EncodeToString(src []byte) string
func FormatInt(num int64) []byte
func FormatUint(num uint64) []byte
func ParseInt(src []byte) (int64, error)
func ParseUint(src []byte) (uint64, error)
type CorruptInputError int64
type Encoding struct{ ... }
    func NewEncoding(encoder string) *Encoding
Usage
// Basic usage.
Encode(src []byte) []byte
EncodeToString(src []byte) string
Decode(src []byte) ([]byte, error)
DecodeString(src string) ([]byte, error)
FormatInt(num int64) []byte
FormatUint(num uint64) []byte
ParseInt(src []byte) (int64, error)
ParseUint(src []byte) (uint64, error)

// Providing a dst buffer, you may reuse buffers to reduce memory allocation.
EncodeToBuf(dst []byte, src []byte) []byte
DecodeToBuf(dst []byte, src []byte) ([]byte, error)
AppendInt(dst []byte, num int64) []byte
AppendUint(dst []byte, num uint64) []byte

// Or you may use a custom encoding alphabet.
enc := NewEncoding("...my-62-byte-string-alphabet...")
enc.XXX()
编码解码 base58

见: base58

或: https://github.com/fufuok/basex

DOC
package base58 // import "github.com/shoddybutter/utils/base58"

func CheckDecode(input string) (result []byte, version byte, err error)
func CheckEncode(input []byte, version byte) string
func Decode(b string) []byte
func Encode(b []byte) string
高性能 Hash 方法及生成器

见: xhash

DOC
package xhash // import "github.com/shoddybutter/utils/xhash"

func AddBytes32(h uint32, b []byte) uint32
func AddBytes64(h uint64, b []byte) uint64
func AddString32(h uint32, s string) uint32
func AddString64(h uint64, s string) uint64
func AddUint32(h, u uint32) uint32
func AddUint64(h uint64, u uint64) uint64
func Djb33(s string) uint32
func FnvHash(s string) uint64
func FnvHash32(s string) uint32
func GenHasher[K comparable]() func(K) uintptr
func GenHasher64[K comparable]() func(K) uint64
func GenSeedHasher64[K comparable]() func(maphash.Seed, K) uint64
func Hash(b []byte, h hash.Hash) []byte
func HashBytes(b ...[]byte) string
func HashBytes32(b ...[]byte) uint32
func HashBytes64(b ...[]byte) uint64
func HashSeedString(seed maphash.Seed, s string) uint64
func HashSeedUint64(seed maphash.Seed, n uint64) uint64
func HashString(s ...string) string
func HashString32(s ...string) uint32
func HashString64(s ...string) uint64
func HashUint32(u uint32) uint32
func HashUint64(u uint64) uint64
func Hmac(b []byte, key []byte, h func() hash.Hash) []byte
func HmacSHA1(b, key []byte) []byte
func HmacSHA1Hex(s, key string) string
func HmacSHA256(b, key []byte) []byte
func HmacSHA256Hex(s, key string) string
func HmacSHA512(b, key []byte) []byte
func HmacSHA512Hex(s, key string) string
func MD5(b []byte) []byte
func MD5BytesHex(bs []byte) string
func MD5Hex(s string) string
func MD5Reader(r io.Reader) (string, error)
func MD5Sum(filename string) (string, error)
func MemHash(s string) uint64
func MemHash32(s string) uint32
func MemHashb(b []byte) uint64
func MemHashb32(b []byte) uint32
func MustMD5Sum(filename string) string
func Sha1(b []byte) []byte
func Sha1Hex(s string) string
func Sha256(b []byte) []byte
func Sha256Hex(s string) string
func Sha512(b []byte) []byte
func Sha512Hex(s string) string
func Sum32(s string) uint32
func Sum64(s string) uint64
func SumBytes32(bs []byte) uint32
func SumBytes64(bs []byte) uint64
type Hashable interface{ ... }
可排序全局唯一 ID 生成器

比 UUID 更快, 更短

  • 要使用 UUIDv4 可以使用 utils.UUID()

  • 要使用程序运行时自增 ID 可以使用 utils.ID()

见: xid (@rs)

或: http://github.com/fufuok/xid

DOC
package xid // import "github.com/shoddybutter/utils/xid"

func NewBytes() []byte
func NewString() string
func Sort(ids []ID)
type ID [rawLen]byte
    func FromBytes(b []byte) (ID, error)
    func FromString(id string) (ID, error)
    func New() ID
    func NewWithTime(t time.Time) ID
    func NilID() ID
自守护进程和后台运行

见: xdaemon (@zh-five)

或: https://github.com/fufuok/xdaemon

DOC
package xdaemon // import "github.com/shoddybutter/utils/xdaemon"

const EnvName = "XW_DAEMON_IDX"
func Background(logFile string, isExit bool) (*exec.Cmd, error)
func NewSysProcAttr() *syscall.SysProcAttr
type Daemon struct{ ... }
    func NewDaemon(logFile string) *Daemon
高性能并发安全同步扩展库

见: xsync (@puzpuzpuz)

或: https://github.com/fufuok/xsync

官方版本: v3.0.0 已统一了调用方法并内置了 hasher 生成器, 不再需要之前的改动, 直接使用官方原版就好

DOC
package xsync // import "github.com/shoddybutter/utils/xsync"

type Counter struct { ... }
    func (c *Counter) Add(delta int64)
    func (c *Counter) Dec()
    func (c *Counter) Inc()
    func (c *Counter) Reset()
    func (c *Counter) Value() int64

type IntegerConstraint interface {
        ~int | ~int8 | ~int16 | ~int32 | ~int64 | ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr
}

type MPMCQueue struct { ... }
    func NewMPMCQueue(capacity int) *MPMCQueue
    func (q *MPMCQueue) Dequeue() interface{}
    func (q *MPMCQueue) Enqueue(item interface{})
    func (q *MPMCQueue) TryDequeue() (item interface{}, ok bool)
    func (q *MPMCQueue) TryEnqueue(item interface{}) bool

type Map struct { ... }
    func NewMap() *Map
    func (m *Map) Delete(key string)
    func (m *Map) Load(key string) (value interface{}, ok bool)
    func (m *Map) LoadAndDelete(key string) (value interface{}, loaded bool)
    func (m *Map) LoadAndStore(key string, value interface{}) (actual interface{}, loaded bool)
    func (m *Map) LoadOrCompute(key string, valueFn func() interface{}) (actual interface{}, loaded bool)
    func (m *Map) LoadOrStore(key string, value interface{}) (actual interface{}, loaded bool)
    func (m *Map) Range(f func(key string, value interface{}) bool)
    func (m *Map) Size() int
    func (m *Map) Store(key string, value interface{})

type MapOf[K comparable, V any] struct { ... }
    func NewIntegerMapOf[K IntegerConstraint, V any]() *MapOf[K, V]
    func NewMapOf[V any]() *MapOf[string, V]
    func NewTypedMapOf[K comparable, V any](hasher func(K) uint64) *MapOf[K, V]
    func (m *MapOf[K, V]) Delete(key K)
    func (m *MapOf[K, V]) Load(key K) (value V, ok bool)
    func (m *MapOf[K, V]) LoadAndDelete(key K) (value V, loaded bool)
    func (m *MapOf[K, V]) LoadAndStore(key K, value V) (actual V, loaded bool)
    func (m *MapOf[K, V]) LoadOrCompute(key K, valueFn func() V) (actual V, loaded bool)
    func (m *MapOf[K, V]) LoadOrStore(key K, value V) (actual V, loaded bool)
    func (m *MapOf[K, V]) Range(f func(key K, value V) bool)
    func (m *MapOf[K, V]) Size() int
    func (m *MapOf[K, V]) Store(key K, value V)

type RBMutex struct { ... }
    func (m *RBMutex) Lock()
    func (m *RBMutex) RLock() *RToken
    func (m *RBMutex) RUnlock(t *RToken)
    func (m *RBMutex) Unlock()

type RToken struct { ... }
高效的 JSON 字符串操作库集
  1. 只有 1 次内存分配的 JSON 字符串生成器

见: jsongen (@darjun)

或: https://github.com/fufuok/jsongen

DOC
package jsongen // import "github.com/shoddybutter/utils/xjson/jsongen"

Package jsongen forked from darjun/json-gen

type Array []Value
    func NewArray() *Array
type Map struct{ ... }
    func NewMap() *Map
type QuotedValue string
type RawBytes []byte
type RawString string
type UnquotedValue string
type Value interface{ ... }
    func EscapeString(s string) Value
  1. 超高效的 JSON 字符串解析和字段搜索

见: gjson (@tidwall)

DOC
package gjson // import "github.com/shoddybutter/utils/xjson/gjson"

Package gjson provides searching for json strings.

var DisableModifiers = false
func AddModifier(name string, fn func(json, arg string) string)
func AppendJSONString(dst []byte, s string) []byte
func ForEachLine(json string, iterator func(line Result) bool)
func ModifierExists(name string, fn func(json, arg string) string) bool
func Valid(json string) bool
func ValidBytes(json []byte) bool
type Result struct{ ... }
    func Get(json, path string) Result
    func GetBytes(json []byte, path string) Result
    func GetMany(json string, path ...string) []Result
    func GetManyBytes(json []byte, path ...string) []Result
    func Parse(json string) Result
    func ParseBytes(json []byte) Result
    func (t Result) Array() []Result
    func (t Result) Bool() bool
    func (t Result) Exists() bool
    func (t Result) Float() float64
    func (t Result) ForEach(iterator func(key, value Result) bool)
    func (t Result) Get(path string) Result
    func (t Result) Int() int64
    func (t Result) IsArray() bool
    func (t Result) IsBool() bool
    func (t Result) IsObject() bool
    func (t Result) Less(token Result, caseSensitive bool) bool
    func (t Result) Map() map[string]Result
    func (t Result) Path(json string) string
    func (t Result) Paths(json string) []string
    func (t Result) String() string
    func (t Result) Time() time.Time
    func (t Result) Uint() uint64
    func (t Result) Value() interface{}
type Type int
    const Null Type = iota ...
  1. JSON 字符串字段修改和删除

见: sjson (@tidwall)

DOC
package sjson // import "github.com/shoddybutter/utils/xjson/sjson"

Package sjson provides setting json values.

func Delete(json, path string) (string, error)
func DeleteBytes(json []byte, path string) ([]byte, error)
func Set(json, path string, value interface{}) (string, error)
func SetBytes(json []byte, path string, value interface{}) ([]byte, error)
func SetBytesOptions(json []byte, path string, value interface{}, opts *Options) ([]byte, error)
func SetOptions(json, path string, value interface{}, opts *Options) (string, error)
func SetRaw(json, path, value string) (string, error)
func SetRawBytes(json []byte, path string, value []byte) ([]byte, error)
func SetRawBytesOptions(json []byte, path string, value []byte, opts *Options) ([]byte, error)
func SetRawOptions(json, path, value string, opts *Options) (string, error)
type Options struct{ ... }
  1. JSON 字符串格式化和校验

见: pretty (@tidwall)

DOC
package pretty // import "github.com/shoddybutter/utils/xjson/pretty"

var DefaultOptions = &Options{ ... }
func Color(src []byte, style *Style) []byte
func Pretty(json []byte) []byte
func PrettyOptions(json []byte, opts *Options) []byte
func Spec(src []byte) []byte
func SpecInPlace(src []byte) []byte
func Ugly(json []byte) []byte
func UglyInPlace(json []byte) []byte
type Options struct{ ... }
type Style struct{ ... }
    var TerminalStyle *Style
  1. 字符串模式匹配(*?通配符搜索)

见: match (@tidwall)

DOC
package match // import "github.com/shoddybutter/utils/xjson/match"

Package match provides a simple pattern matcher with unicode support.

func Allowable(pattern string) (min, max string)
func IsPattern(str string) bool
func Match(str, pattern string) bool
func MatchLimit(str, pattern string, maxcomp int) (matched, stopped bool)
常用的池

[]byte 更多功能的字节切片池化见: github.com/fufuok/bytespool

见: pools

DOC
package bytespool // import "github.com/shoddybutter/utils/pools/bytespool"

func Append(buf []byte, elems ...byte) []byte
func AppendString(buf []byte, elems string) []byte
func Get(size int) []byte
func Make(size int) []byte
func New(size int) []byte
func Put(buf []byte)
func Release(buf []byte) bool
func SetMaxSize(size int) bool
type CapacityPools struct{ ... }

package bufferpool // import "github.com/shoddybutter/utils/pools/bufferpool"

func Get() *bytes.Buffer
func New(bs []byte) *bytes.Buffer
func NewByte(c byte) *bytes.Buffer
func NewRune(r rune) *bytes.Buffer
func NewString(s string) *bytes.Buffer
func Put(buf *bytes.Buffer)
func Release(buf *bytes.Buffer) bool
func SetMaxSize(size int) bool

package readerpool // import "github.com/shoddybutter/utils/pools/readerpool"

func New(b []byte) *bytes.Reader
func Release(r *bytes.Reader)

package timerpool // import "github.com/shoddybutter/utils/pools/timerpool"

func New(d time.Duration) *time.Timer
func Release(t *time.Timer)

package tickerpool // import "github.com/shoddybutter/utils/pools/tickerpool"

func New(d time.Duration) *time.Ticker
func Release(t *time.Ticker)
并发任务调度库

见: sched

或: https://github.com/fufuok/sched

简洁, 高效, 并发限制, 复用 goroutine

DOC
package sched // import "github.com/shoddybutter/utils/sched"

type Option func(w *Pool)
    func Queues(limit int) Option
    func Workers(limit int) Option
type Pool struct{ ... }
    func New(opts ...Option) *Pool
NTP 简单时间同步

独立项目, 见: https://github.com/fufuok/ntp

默认优选 NTP Host, 周期性返回时钟偏移值或当前时间, 也可指定 Host 单次请求

简单的日志文件滚动

示例: xfile/examples

带文件写入 Buffer 的日志文件滚动器, 比如按日期滚动生成新文件

DOC
package ntp // import "github.com/shoddybutter/utils/ntp"

Package ntp provides an implementation of a Simple NTP (SNTP) client capable
of querying the current time from a remote NTP server. See RFC5905
(https://tools.ietf.org/html/rfc5905) for more details.

This approach grew out of a go-nuts post by Michael Hofmann:
https://groups.google.com/forum/?fromgroups#!topic/golang-nuts/FlcdMU5fkLQ

const LeapNoWarning LeapIndicator = 0 ...
func ClockOffsetChan(ctx context.Context, interval time.Duration, hosts ...string) chan time.Duration
func Time(host string) (time.Time, error)
func TimeChan(ctx context.Context, interval time.Duration, hosts ...string) chan time.Time
func TimeV(host string, version int) (time.Time, error)
type HostResponse struct{ ... }
    func HostPreferred(hosts []string) *HostResponse
type LeapIndicator uint8
type QueryOptions struct{ ... }
type Response struct{ ... }
    func GetResponse(host string) *Response
    func Query(host string) (*Response, error)
    func QueryWithOptions(host string, opt QueryOptions) (*Response, error)

使用示例

package main

import (
	"encoding/json"
	"fmt"
	"sync/atomic"
	"time"

	"github.com/shoddybutter/utils"
	"github.com/shoddybutter/utils/assert"
	"github.com/shoddybutter/utils/base58"
	"github.com/shoddybutter/utils/base62"
	"github.com/shoddybutter/utils/conv"
	"github.com/shoddybutter/utils/pools/bufferpool"
	"github.com/shoddybutter/utils/sched"
	"github.com/shoddybutter/utils/xcrypto"
	"github.com/shoddybutter/utils/xhash"
	"github.com/shoddybutter/utils/xid"
	"github.com/shoddybutter/utils/xjson/jsongen"
)

func main() {
	var s string
	s = utils.GetString(123.45)         // "123.45"
	s = utils.GetString(nil)            // ""
	s = utils.GetString(nil, "default") // "default"
	s = utils.GetString([]byte("ff"))   // "ff"
	s = utils.GetString(true)           // "true"

	s = conv.Any(123.45).String()       // "123.45"
	s = conv.Any(nil).String()          // ""
	s = conv.Any([]byte("ff")).String() // "ff"
	s = conv.Any(true).String()         // "true"

	s = conv.Float64(123.45).String()     // "123.45"
	s = conv.Bytes([]byte("ff")).String() // "ff"

	s = conv.Ftoa(123.45) // "123.45"
	s = conv.Vtoa(nil)    // ""
	s = conv.Ttoa(true)   // "true"

	x := utils.JoinString(s, "OK") // "trueOK"

	b := []byte("trueOK")
	s = utils.B2S(b[0:1])                                     // "t"
	safeS1 := utils.B2S([]byte(s[0:1]))                       // 转换为不可变字符串, CopyString 的实现
	safeS2 := utils.CopyString(s[0:1])                        // 不可变字符串, s 可以被 GC 回收
	safeS3 := utils.GetSafeString(s[0:1], "optional default") // 不可变字符串
	safeS4 := utils.GetSafeB2S(b[0:1], "optional default")    // 转换为不可变字符串
	safeS5 := string(b[0:1])                                  // 标准转换
	b[0] = 70                                                 // 注意: 底层数组变化会引起字符串 s 发生改变
	fmt.Println(s, safeS1, safeS2, safeS3, safeS4, safeS5)    // F t t t t t

	x = xcrypto.Encrypt("myData", "myKey")
	fmt.Println(x) // Csi64LeQLmVhuZTh1xkCKM
	x = xcrypto.Decrypt("Csi64LeQLmVhuZTh1xkCKM", "myKey")
	fmt.Println(x) // myData

	k := utils.RandBytes(16)
	x = xcrypto.AesCBCEnPKCS7StringHex("myData", k)
	fmt.Println(x) // 9dce01c049de7493ce2fae6a2707fad1
	x = xcrypto.AesCBCEnStringB58("myData", k)
	fmt.Println(x) // 6NHTJhaW5mfeUioFLrbpRX

	k = []byte("1234567812345678")
	x = xcrypto.GCMEnStringHex("myData", k)
	fmt.Println(x) // 6501bb4737c772b9a2956d87183d4793d44b0e3c233bf2c6435d70502913d5701a98
	x = xcrypto.GCMEnStringB58("myData", k)
	fmt.Println(x) // 5H9ftJvyBesQS7yNGoW7sBCqpwedpEhkjB7k4Z8QBi8GYJo

	x = xcrypto.GCMEnStringB64("myData", k)
	fmt.Println(xcrypto.GCMDeStringB64(x, k)) // myData

	x = utils.UUIDString()
	fmt.Println(x) // 04a49f17-8c37-44f7-a9c5-ea291c3736d7
	x = utils.UUIDSimple()
	fmt.Println(x) // 16123e98b35a4cea8e9cc127f379ff52
	x = utils.UUIDShort()
	fmt.Println(x) // Mw4hP7t9bnMMczU2AvyorU
	x = xid.NewString()
	fmt.Println(x) // c294bsnn5ek0ub0200fg

	x = base62.EncodeToString([]byte("Test data"))
	fmt.Println(x) // hRXYkBCdzVGV
	bs, _ := base62.DecodeString("hRXYkBCdzVGV")
	x = utils.B2S(bs)
	fmt.Println(x) // Test data

	x = base58.Encode([]byte("Test data"))
	fmt.Println(x) // 25JnwSn7XKfNQ
	x = utils.B2S(base58.Decode("25JnwSn7XKfNQ"))
	fmt.Println(x) // Test data

	whoami := utils.Executable(true)
	pwd := utils.ExecutableDir(true)
	fmt.Println(whoami, pwd)

	fmt.Println(utils.HumanBytes(1234567890))  // 1.2 GB
	fmt.Println(utils.HumanIBytes(1234567890)) // 1.1 GiB
	fmt.Println(utils.HumanKbps(1234567890))   // 1.2 Gbps
	fmt.Println(utils.Commaf(1234567890.123))  // 1,234,567,890.123

	now := time.Date(2020, 2, 18, 12, 13, 14, 123456789, time.UTC)
	fmt.Println(utils.BeginOfLastWeek(now).Format(time.RFC3339Nano)) // 2020-02-10T00:00:00Z

	fmt.Println(utils.GetNotInternalIPv4String("100.125.1.1", "", true))  // 100.125.1.1
	fmt.Println(utils.GetNotInternalIPv4String("100.125.1.1", "1.2.3.4")) // 1.2.3.4
	fmt.Println(utils.GetNotInternalIPv4String("192.168.1.1", "1.2.3.4")) // 1.2.3.4
	fmt.Println(utils.GetNotInternalIPv4String("119.118.7.6", "1.2.3.4")) // 119.118.7.6

	var nilN struct{}
	var nilY *struct{}
	var nilY2 *struct{}
	var nilY3 = (*struct{})(nil)
	fmt.Println(assert.IsNil(nilN), assert.IsNil(nilY))                     // false true
	fmt.Println(assert.IsNil(nilY2), assert.IsNil(nilY3))                   // true true
	fmt.Println(assert.DeepEqual(nil, nilY), assert.DeepEqual(nilY2, nilY)) // false true
	fmt.Println(assert.DeepEqual(nilY3, nilY), nilY3 == nil)                // true true
	fmt.Println(nilY == nil, nilY == nilY2, nilY == nilY3)                  // true true true
	fmt.Println(assert.IsEmpty(nilN), assert.IsEmpty(nilY))                 // true true

	public, private := xcrypto.GenRSAKey(1024)
	fmt.Println(string(public))
	fmt.Println(string(private))

	fmt.Println(utils.IsPrivateIPString("FC00::"))         // true
	fmt.Println(utils.IsPrivateIPString("172.17.0.0"))     // true
	fmt.Println(utils.IsInternalIPv4String("100.125.1.1")) // true

	fmt.Println(utils.ToLower("TesT"))                                             // test
	fmt.Println(utils.EqualFold(utils.Trim("/TesT/", '/'), utils.ToUpper("Test"))) // true

	host, port := utils.SplitHostPort("demo.com:77")
	fmt.Println(host) // demo.com
	fmt.Println(port) // 77

	fmt.Println(utils.Rand.Intn(10), utils.FastIntn(10))

	dec, _ := utils.Zip(utils.RandBytes(3000))
	src, _ := utils.Unzip(dec)
	fmt.Println(len(dec), len(src)) // 2288 3000

	type T struct {
		Name string `json:"name"`
	}
	t1 := T{"ff"}
	buf := bufferpool.Get()
	_ = json.NewEncoder(buf).Encode(&t1)
	fmt.Println("json:", buf.String()) // json: {"name":"ff"}
	bufferpool.Put(buf)

	var t2 T
	buf = bufferpool.Get()
	buf.WriteString(`{"name":"ff"}`)
	_ = json.NewDecoder(buf).Decode(&t2)
	fmt.Printf("struct: %+v\n", t2)       // struct: {Name:ff}
	fmt.Println("empty:", buf.Len() == 0) // empty: true
	bufferpool.Put(buf)

	js := jsongen.NewMap()
	js.PutString("s", `a"b"\c`)
	js.PutFloat("f", 3.14)
	js.PutBool("b", false)
	jsArr := jsongen.NewArray()
	jsArr.AppendInt(7)
	jsArr.AppendStringArray([]string{"A", "B"})
	js.PutArray("sub", jsArr)
	jsBytes := js.Serialize(nil)
	fmt.Printf("%s\n", jsBytes) // {"s":"a\"b\"\\c","f":3.14,"b":false,"sub":[7,["A","B"]]}

	fmt.Println(utils.ID(), utils.ID()) // 1, 2

	fmt.Println(utils.CutString("test@fufuok.com", "@")) // test fufuok.com true

	fmt.Println(xhash.Sum64("test"))  // 18007334074686647077
	fmt.Println(xhash.MD5Hex("test")) // 098f6bcd4621d373cade4e832627b4f6

	lock := utils.NewTryMutex()
	lock.Lock()
	ok := lock.TryLock(20 * time.Millisecond)
	fmt.Println(ok) // false
	lock.Unlock()
	ok = lock.TryLock(20 * time.Millisecond)
	fmt.Println(ok) // true
	lock.Unlock()

	// 等待下一秒 0 毫秒 (近似)
	now = utils.WaitNextSecondWithTime()
	fmt.Println("hour:minute:second.00*ms", now)

	count := int64(0)
	bus := sched.New() // 默认并发数: runtime.NumCPU()
	for i := 0; i < 30; i++ {
		bus.Add(1)
		bus.RunWithArgs(func(n ...interface{}) {
			atomic.AddInt64(&count, int64(n[0].(int)))
		}, i)
	}
	bus.Wait()
	fmt.Println("count:", atomic.LoadInt64(&count)) // count: 435

	// 继续下一批任务
	bus.Add(1)
	bus.Run(func() {
		fmt.Println("is running:", bus.IsRunning(), bus.Running()) // is running: true 1
	})
	bus.Wait()
	bus.Release()

	// 指定并发数
	bus = sched.New(sched.Workers(2))
	bus.Add(5)
	for i := 0; i < 5; i++ {
		bus.Run(func() {
			fmt.Println(time.Now())
			time.Sleep(time.Second)
		})
	}
	bus.WaitAndRelease()
	fmt.Println("is running:", bus.IsRunning()) // is running: false

	// 原子操作的安全布尔值 (与 go1.19 一致)
	var atomicBool utils.Bool
	atomicBool.StoreTrue()
	fmt.Println("is running:", atomicBool.Load()) // is running: true
	atomicBool.Toggle()
	fmt.Println("is running:", atomicBool.String()) // is running: false

	woo := func() {
		panic("woo...")
	}
	utils.SafeGo(woo)
	utils.SafeGo(woo, func(err interface{}, trace []byte) {
		fmt.Printf("SafeGo, ERR: %v, Traceback: \n%s\n", err, trace)
	})
	fmt.Println("Ctrl+c to exit")
	utils.WaitSignal()
	fmt.Println("Exited.")
}

🔑 JetBrains OS licenses

The utils package was developed using GoLand IDE under the Free JetBrains Open Source License granted by JetBrains s.r.o. I would like to take this opportunity to express my gratitude.

JetBrains logo.

ff

Documentation

Index

Constants

View Source
const (
	Byte = 1 << (iota * 10)
	KiByte
	MiByte
	GiByte
	TiByte
	PiByte
	EiByte
)

Ref: dustin/go-humanize IEC Sizes. kibis of bits

View Source
const (
	IByte = 1
	KByte = IByte * 1000
	MByte = KByte * 1000
	GByte = MByte * 1000
	TByte = GByte * 1000
	PByte = TByte * 1000
	EByte = PByte * 1000
)

SI Sizes.

View Source
const (
	IPv4Min = 0
	IPv4Max = 1<<32 - 1
)
View Source
const (
	ChinaTimeZone   = "UTC+8"
	ChinaTimeOffset = 8 * 60 * 60
)
View Source
const (
	// PtrSize 4 on 32-bit systems, 8 on 64-bit.
	PtrSize = 4 << (^uintptr(0) >> 63)
)

Variables

View Source
var (

	// BigByte is one byte in bit.Ints
	BigByte = big.NewInt(1)
	// BigKiByte is 1,024 bytes in bit.Ints
	BigKiByte = (&big.Int{}).Mul(BigByte, bigIECExp)
	// BigMiByte is 1,024 k bytes in bit.Ints
	BigMiByte = (&big.Int{}).Mul(BigKiByte, bigIECExp)
	// BigGiByte is 1,024 m bytes in bit.Ints
	BigGiByte = (&big.Int{}).Mul(BigMiByte, bigIECExp)
	// BigTiByte is 1,024 g bytes in bit.Ints
	BigTiByte = (&big.Int{}).Mul(BigGiByte, bigIECExp)
	// BigPiByte is 1,024 t bytes in bit.Ints
	BigPiByte = (&big.Int{}).Mul(BigTiByte, bigIECExp)
	// BigEiByte is 1,024 p bytes in bit.Ints
	BigEiByte = (&big.Int{}).Mul(BigPiByte, bigIECExp)
	// BigZiByte is 1,024 e bytes in bit.Ints
	BigZiByte = (&big.Int{}).Mul(BigEiByte, bigIECExp)
	// BigYiByte is 1,024 z bytes in bit.Ints
	BigYiByte = (&big.Int{}).Mul(BigZiByte, bigIECExp)
)

Ref: dustin/go-humanize

View Source
var (

	// BigSIByte is one SI byte in big.Ints
	BigSIByte = big.NewInt(1)
	// BigKByte is 1,000 SI bytes in big.Ints
	BigKByte = (&big.Int{}).Mul(BigSIByte, bigSIExp)
	// BigMByte is 1,000 SI k bytes in big.Ints
	BigMByte = (&big.Int{}).Mul(BigKByte, bigSIExp)
	// BigGByte is 1,000 SI m bytes in big.Ints
	BigGByte = (&big.Int{}).Mul(BigMByte, bigSIExp)
	// BigTByte is 1,000 SI g bytes in big.Ints
	BigTByte = (&big.Int{}).Mul(BigGByte, bigSIExp)
	// BigPByte is 1,000 SI t bytes in big.Ints
	BigPByte = (&big.Int{}).Mul(BigTByte, bigSIExp)
	// BigEByte is 1,000 SI p bytes in big.Ints
	BigEByte = (&big.Int{}).Mul(BigPByte, bigSIExp)
	// BigZByte is 1,000 SI e bytes in big.Ints
	BigZByte = (&big.Int{}).Mul(BigEByte, bigSIExp)
	// BigYByte is 1,000 SI z bytes in big.Ints
	BigYByte = (&big.Int{}).Mul(BigZByte, bigSIExp)
)
View Source
var (
	// Rand goroutine-safe, use Rand.xxx instead of rand.xxx
	Rand = NewRand()
	Seed = FastRand()
)
View Source
var ErrInvalidHostPort = errors.New("invalid Host or Port")
View Source
var StackTraceBufferSize = 4 << 10

Functions

func B2S

func B2S(b []byte) string

B2S converts byte slice to string without a memory allocation. Slower: unsafe.String(unsafe.SliceData(b), len(b)) strings.Clone(): unsafe.String(&b[0], len(b))

func B64Decode

func B64Decode(s string) []byte

B64Decode Base64 解码

func B64Encode

func B64Encode(b []byte) string

B64Encode Base64 编码

func B64UrlDecode

func B64UrlDecode(s string) []byte

B64UrlDecode Base64 解码

func B64UrlEncode

func B64UrlEncode(b []byte) string

B64UrlEncode Base64 解码, 安全 URL, 替换: "+/" 为 "-_"

func BeginOfDay

func BeginOfDay(t time.Time) time.Time

BeginOfDay 当天 0 点

func BeginOfHour

func BeginOfHour(t time.Time) time.Time

BeginOfHour 0 分

func BeginOfLastMonth

func BeginOfLastMonth(t time.Time) time.Time

BeginOfLastMonth 上月第一天 0 点

func BeginOfLastWeek

func BeginOfLastWeek(t time.Time) time.Time

BeginOfLastWeek 上周一 0 点

func BeginOfMinute

func BeginOfMinute(t time.Time) time.Time

BeginOfMinute 0 秒

func BeginOfMonth

func BeginOfMonth(t time.Time) time.Time

BeginOfMonth 当月第一天 0 点

func BeginOfNextMonth

func BeginOfNextMonth(t time.Time) time.Time

BeginOfNextMonth 下月第一天 0 点

func BeginOfNextWeek

func BeginOfNextWeek(t time.Time) time.Time

BeginOfNextWeek 下周一 0 点

func BeginOfSecond

func BeginOfSecond(t time.Time) time.Time

BeginOfSecond 0 毫秒

func BeginOfTomorrow

func BeginOfTomorrow(t time.Time) time.Time

BeginOfTomorrow 明天 0 点

func BeginOfWeek

func BeginOfWeek(t time.Time) time.Time

BeginOfWeek 本周一 0 点

func BeginOfYear

func BeginOfYear(t time.Time) time.Time

BeginOfYear 本年第一天 0 点

func BeginOfYesterday

func BeginOfYesterday(t time.Time) time.Time

BeginOfYesterday 昨天 0 点

func BigComma

func BigComma(b *big.Int) string

BigComma big.Int 千分位分隔字符串 Ref: dustin/go-humanize

func BigCommaf

func BigCommaf(v *big.Float) string

BigCommaf big.Float 千分位分隔字符串 Ref: dustin/go-humanize

func Bigoom

func Bigoom(n, b *big.Int) (float64, int)

Bigoom big.Int 总数量级 Ref: dustin/go-humanize

func CPUTicks

func CPUTicks() int64

CPUTicks CPU 时钟周期, 更高精度 (云服务器做伪随机数种子时慎用)

func CallPath

func CallPath() string

CallPath 运行时路径, 编译目录 假如: mklink E:\tmp\linkapp.exe D:\Fufu\Test\abc\app.exe 执行: E:\tmp\linkapp.exe CallPath: E:\Go\src\github.com\fufuok\utils\tmp\osext

func CheckDomain

func CheckDomain(name string) error

CheckDomain returns an error if the host name is not valid. See https://tools.ietf.org/html/rfc1034#section-3.5 and https://tools.ietf.org/html/rfc1123#section-2. Ref: chmike/domain

func Comma

func Comma(v int64) string

Comma 整数转千分位分隔字符串 Ref: dustin/go-humanize e.g. Comma(834142) -> 834,142

func Commaf

func Commaf(v float64) string

Commaf 浮点数转千分位分隔字符串 Ref: dustin/go-humanize e.g. Commaf(834142.32) -> 834,142.32

func Commai

func Commai(v int) string

Commai 整数转千分位分隔字符串

func Commau

func Commau(v uint64) string

Commau 整数转千分位分隔字符串 Ref: dustin/go-humanize

func CopyB2S

func CopyB2S(b []byte) string

CopyB2S Immutable, []byte to string string(b)

func CopyBytes

func CopyBytes(b []byte) []byte

CopyBytes Immutable, []byte to []byte

func CopyS2B

func CopyS2B(s string) []byte

CopyS2B Immutable, string to []byte []byte(s)

func CopyString

func CopyString(s string) string

CopyString Immutable, string to string e.g. fiberParam := utils.CopyString(c.Params("test")) e.g. utils.CopyString(s[500:1000]) // 可以让 s 被 GC 回收 strings.Clone(s) // go1.18

func CutBytes

func CutBytes(s, sep []byte) (before, after []byte, found bool)

CutBytes slices s around the first instance of sep, returning the text before and after sep. The found result reports whether sep appears in s. If sep does not appear in s, cut returns s, nil, false.

Cut returns slices of the original slice s, not copies. Ref: go1.18

func CutString

func CutString(s, sep string) (before, after string, found bool)

CutString xslices s around the first instance of sep, returning the text before and after sep. The found result reports whether sep appears in s. If sep does not appear in s, cut returns s, "", false. Ref: go1.18

func DaysInMonth

func DaysInMonth(year int, m time.Month) int

DaysInMonth 返回月份天数

func DaysInYear

func DaysInYear(year int) int

DaysInYear 返回年份天数

func EncodeUUID

func EncodeUUID(id []byte) []byte

EncodeUUID 编码 UUID

func EndOfDay

func EndOfDay(t time.Time) time.Time

EndOfDay 当天最后时刻

func EndOfHour

func EndOfHour(t time.Time) time.Time

EndOfHour 最后一分

func EndOfLastMonth

func EndOfLastMonth(t time.Time) time.Time

EndOfLastMonth 上月最后一刻

func EndOfLastWeek

func EndOfLastWeek(t time.Time) time.Time

EndOfLastWeek 上周一最后一刻

func EndOfMinute

func EndOfMinute(t time.Time) time.Time

EndOfMinute 最后一秒

func EndOfMonth

func EndOfMonth(t time.Time) time.Time

EndOfMonth 当月最后一刻

func EndOfNextMonth

func EndOfNextMonth(t time.Time) time.Time

EndOfNextMonth 下月最后一刻

func EndOfNextWeek

func EndOfNextWeek(t time.Time) time.Time

EndOfNextWeek 下周一最后一刻

func EndOfSecond

func EndOfSecond(t time.Time) time.Time

EndOfSecond 最后一毫秒

func EndOfTomorrow

func EndOfTomorrow(t time.Time) time.Time

EndOfTomorrow 明天 0 点

func EndOfWeek

func EndOfWeek(t time.Time) time.Time

EndOfWeek 本周末最后一刻

func EndOfYear

func EndOfYear(t time.Time) time.Time

EndOfYear 本年最后一刻

func EndOfYesterday

func EndOfYesterday(t time.Time) time.Time

EndOfYesterday 昨天最后时刻

func EqualFold

func EqualFold(b, s string) bool

EqualFold tests ascii strings for equality case-insensitively Ref: fiber

func EqualFoldBytes

func EqualFoldBytes(b, s []byte) bool

EqualFoldBytes tests ascii slices for equality case-insensitively Ref: fiber

func Executable

func Executable(evalSymlinks ...bool) string

Executable 当前执行程序绝对路径 true 时返回解析符号链接后的绝对路径 Excutable: E:\tmp\linkapp.exe Excutable(true): D:\Fufu\Test\abc\app.exe

func ExecutableDir

func ExecutableDir(evalSymlinks ...bool) string

ExecutableDir 当前执行程序所在目录 true 时返回解析符号链接后的目录 ExcutableDir: E:\tmp ExcutableDir(true): D:\Fufu\Test\abc

func FastIntn

func FastIntn(n int) int

FastIntn this is similar to rand.Intn, but faster. A non-negative pseudo-random number in the half-open interval [0,n). Return 0 if n <= 0.

func FastRand

func FastRand() uint32

FastRand 随机数

func FastRand64

func FastRand64() uint64

func FastRandn

func FastRandn(n uint32) uint32

FastRandn 等同于 FastRand() % n, 但更快 See https://lemire.me/blog/2016/06/27/a-fast-alternative-to-the-modulo-reduction/

func FastRandu

func FastRandu() uint

func FirstString

func FirstString(s, sep string, defaultStr ...string) string

FirstString 获取文本内容第一个分隔符(单字节: sep[0])前的内容

func GetBytes

func GetBytes(v interface{}, defaultVal ...[]byte) []byte

GetBytes 先转为字符串再转为 []byte, 可选指定默认值

func GetDomain

func GetDomain(name string) string

GetDomain 检查并返回清除前后空白的域名

func GetIPPort

func GetIPPort(addr net.Addr) (ip net.IP, port int, err error)

GetIPPort 返回 IP 和 端口

func GetInt

func GetInt(v interface{}, defaultInt ...int) int

GetInt 获取 int 结果, 可选指定默认值(若给定了默认值,则返回正整数或 0)

func GetMonthDays

func GetMonthDays(t time.Time) int

GetMonthDays 当月天数

func GetNotInternalIPv4

func GetNotInternalIPv4(ip, defaultIP net.IP, flag ...bool) net.IP

GetNotInternalIPv4 如果是内网 IPv4 则使用默认值, flag 为真是必定返回一个 IP

func GetNotInternalIPv4String

func GetNotInternalIPv4String(ip, defaultIP string, flag ...bool) string

GetNotInternalIPv4String 如果是内网 IPv4 则使用默认值

func GetSafeB2S

func GetSafeB2S(b []byte, defaultVal ...string) string

GetSafeB2S Immutable, 可选指定默认值

func GetSafeBytes

func GetSafeBytes(b []byte, defaultVal ...[]byte) []byte

GetSafeBytes Immutable, 可选指定默认值

func GetSafeS2B

func GetSafeS2B(s string, defaultVal ...[]byte) []byte

GetSafeS2B Immutable, 可选指定默认值

func GetSafeString

func GetSafeString(s string, defaultVal ...string) string

GetSafeString Immutable, 可选指定默认值

func GetString

func GetString(v interface{}, defaultVal ...string) string

GetString 获取字符串结果, 可选指定默认值

func GoroutineID

func GoroutineID() (uint64, error)

GoroutineID 获取 Goroutine ID

func Gzip

func Gzip(data []byte) ([]byte, error)

func GzipLevel

func GzipLevel(data []byte, level int) (dst []byte, err error)

func HumanBaseBytes

func HumanBaseBytes(v uint64, base float64, sizes []string) string

HumanBaseBytes 数字的数量级表示

func HumanBigBytes

func HumanBigBytes(s *big.Int) string

HumanBigBytes produces a human readable representation of an SI size.

See also: ParseHumanBigBytes.

HumanBigBytes(82854982) -> 83 MB

func HumanBigIBytes

func HumanBigIBytes(s *big.Int) string

HumanBigIBytes produces a human readable representation of an IEC size.

See also: ParseHumanBigBytes.

HumanBigIBytes(82854982) -> 79 MiB

func HumanBigKbps

func HumanBigKbps(s *big.Int) string

HumanBigKbps 1 Kbps = 1000 bit, 传输速率(bit per second, 位每秒) e.g. HumanBigKbps(82854982) -> 83 Mbps

func HumanBytes

func HumanBytes(v uint64) string

HumanBytes 1 KB = 1000 B e.g. HumanBytes(82854982) -> 83 MB

func HumanGBMB

func HumanGBMB(v uint64) string

HumanGBMB 转为 ** GB ** MB 1 GB = 1024 MB

func HumanIBytes

func HumanIBytes(v uint64) string

HumanIBytes 1 KiB = 1024 B e.g. HumanIBytes(82854982) -> 79 MiB

func HumanIntBytes

func HumanIntBytes(v int) string

HumanIntBytes 1 KB = 1000 B

func HumanIntIBytes

func HumanIntIBytes(v int) string

HumanIntIBytes 1 KiB = 1024 B

func HumanIntKbps

func HumanIntKbps(v int) string

HumanIntKbps 1 Kbps = 1000 bit

func HumanKbps

func HumanKbps(v uint64) string

HumanKbps 1 Kbps = 1000 bit, 传输速率(bit per second, 位每秒) e.g. HumanKbps(82854982) -> 83 Mbps

func ID

func ID() uint64

ID 运行时自增 ID (每次程序启动从 1 开始)

func IPv42Long

func IPv42Long(ip net.IP) int

IPv42Long IPv4 转数值

func IPv42LongLittle

func IPv42LongLittle(ip net.IP) int

IPv42LongLittle IPv4 转小端数值

func IPv4String2Long

func IPv4String2Long(ip string) int

IPv4String2Long IPv4 字符串转数值

func IPv4String2LongLittle

func IPv4String2LongLittle(ip string) int

IPv4String2LongLittle IPv4 字符串转数值(小端)

func IPv62Int

func IPv62Int(ip net.IP) *big.Int

IPv62Int IPv6 转数值

func IPv6String2Int

func IPv6String2Int(ip string) *big.Int

IPv6String2Int IPv6 字符串转数值

func InIPNet

func InIPNet(ip net.IP, ipNets map[*net.IPNet]struct{}) bool

InIPNet 是否包含在指定 IPNet 列表中

func InIPNetString

func InIPNetString(ip string, ipNets map[*net.IPNet]struct{}) bool

InIPNetString 是否包含在指定 IPNet 列表中

func InInts

func InInts(slice []int, n int) bool

InInts 检查整数是否存在于 slice

func InStrings

func InStrings(ss []string, s string) bool

InStrings 检查字符串是否存在于 slice 用 slices.Contains 替代

func InitCSTLocation

func InitCSTLocation() (name string, loc *time.Location, cst *time.Location, ok bool)

InitCSTLocation 初始化默认时区为中国东八区(GMT+8) 返回值: name: "Asia/Shanghai" 或本地时区名称 loc: 优先尝试解析中国时区, 失败(Windows)后使用本地时区(time.Local) cst: 强制偏移的中国时区, !!!注意: 无法使用 time.LoadLocation(cst.String()) 二次加载 ok: true 表示初始化中国时区成功, false 表示 local 不一定是中国时区 Deprecated: 对于 公元1年 这种极早日期, 某些系统的时区数据库可能使用当时的 本地平均时间(LMT), 结果: +08:05:43 而非标准 +08:00

func InitChinaLocation

func InitChinaLocation() *time.Location

InitChinaLocation 设置全局时区为中国东八区(GMT+8)

func InitLocation

func InitLocation(name string) (*time.Location, bool)

InitLocation 解析并初始化本地时区

func Int2IPv6

func Int2IPv6(ipInt *big.Int) net.IP

Int2IPv6 数值转 IPv4

func Int2IPv6String

func Int2IPv6String(n *big.Int) string

Int2IPv6String 数值转 IPv6 字符串

func IsIP

func IsIP(ip string) bool

IsIP 判断是否为合法 IPv4 / IPv6

func IsIPv4

func IsIPv4(s string) bool

IsIPv4 判断是否为合法 IPv4 IsIPv4 works the same way as net.ParseIP, but without check for IPv6 case and without returning net.IP slice, whereby IsIPv4 makes no allocations. Ref: gofiber/utils

func IsIPv6

func IsIPv6(s string) bool

IsIPv6 判断是否为合法 IPv6 IsIPv6 works the same way as net.ParseIP, but without check for IPv4 case and without returning net.IP slice, whereby IsIPv6 makes no allocations. Ref: gofiber/utils

func IsInternalIPv4

func IsInternalIPv4(ip net.IP) bool

IsInternalIPv4 是否为内网 IPv4, 包含 NAT 专用网段 RFC6598, 比如华为云 ELB 的 100.125.0.0/16

func IsInternalIPv4String

func IsInternalIPv4String(ip string) bool

IsInternalIPv4String 是否为内网 IPv4

func IsLeapYear

func IsLeapYear(year int) bool

IsLeapYear 判断是否为闰年

func IsLetter

func IsLetter(s string) bool

IsLetter 检查字符串是否全是 ASCII 字母

func IsLetterOrNumeric

func IsLetterOrNumeric(s string) bool

IsLetterOrNumeric 检查字符串是否全是 ASCII 字母或数字

func IsNumeric

func IsNumeric(s string) bool

IsNumeric 检查字符串是否全是 ASCII 数字: 0-9

func IsPrivateIP

func IsPrivateIP(ip net.IP) bool

IsPrivateIP reports whether ip is a private address, according to RFC 1918 (IPv4 addresses) and RFC 4193 (IPv6 addresses). Ref: go1.17+ func (ip IP) IsPrivate() bool

func IsPrivateIPString

func IsPrivateIPString(ip string) bool

IsPrivateIPString 是否为私有 IP

func JoinBytes

func JoinBytes(b ...[]byte) []byte

JoinBytes 拼接 []byte

func JoinString

func JoinString(s ...string) string

JoinString 拼接字符串

func JoinStringBytes

func JoinStringBytes(s ...string) []byte

JoinStringBytes 拼接字符串, 返回 bytes from bytes.Join()

func LastString

func LastString(s, sep string, defaultStr ...string) string

LastString 获取文本内容最后一个分隔符(单字节: sep[0])后的内容

func LeftPad

func LeftPad(s, pad string, n int) string

LeftPad 从左填充字符串到指定长度

func LeftPadBytes

func LeftPadBytes(b, pad []byte, n int) []byte

LeftPadBytes 从左填充到指定长度

func Logn

func Logn(n, b float64) float64

func Long2IPv4

func Long2IPv4(n int) net.IP

Long2IPv4 数值转 IPv4

func Long2IPv4String

func Long2IPv4String(n int) string

Long2IPv4String 数值转 IPv4 字符串

func LongLittle2IPv4

func LongLittle2IPv4(n int) net.IP

LongLittle2IPv4 小端数值转 IPv4

func LongLittle2IPv4String

func LongLittle2IPv4String(n int) string

LongLittle2IPv4String 数值(小端)转 IPv4 字符串

func MaxInt

func MaxInt(a, b int) int

MaxInt 整数取大值

func MinInt

func MinInt(a, b int) int

MinInt 整数取小值

func MustBool

func MustBool(v interface{}) bool

MustBool 强制转为 bool

func MustInt

func MustInt(v interface{}) int

MustInt 强制转为整数 (int)

func MustJSON

func MustJSON(v interface{}) []byte

MustJSON 转 json 返回 []byte

func MustJSONIndent

func MustJSONIndent(v interface{}) []byte

MustJSONIndent 转 json 返回 []byte

func MustJSONIndentString

func MustJSONIndentString(v interface{}) string

MustJSONIndentString 转 json Indent 返回 string

func MustJSONString

func MustJSONString(v interface{}) string

MustJSONString 转 json 返回 string

func MustParseHumanBigBytes

func MustParseHumanBigBytes(s string, defaultVal ...*big.Int) *big.Int

MustParseHumanBigBytes 解析数字的数量级表示 e.g. MustParseHumanBigBytes("42 MB") -> 42000000 e.g. MustParseHumanBigBytes("-42 mib", 123) -> 123

func MustParseHumanBytes

func MustParseHumanBytes(s string, defaultVal ...uint64) uint64

MustParseHumanBytes 解析数字的数量级表示 e.g. MustParseHumanBytes("42 MB") -> 42000000 e.g. MustParseHumanBytes("-42 mib", 123) -> 123

func MustString

func MustString(v interface{}, timeLayout ...string) string

MustString 强制转为字符串

func NanoTime

func NanoTime() int64

NanoTime 返回当前时间 (以纳秒为单位)

func NewRand

func NewRand(seed ...int64) *rand.Rand

NewRand goroutine-safe rand.Rand, optional seed value

func NewSpinLock

func NewSpinLock() sync.Locker

NewSpinLock instantiates a spin-lock.

func Pad

func Pad(s, pad string, n int) string

Pad 填充字符串到指定长度, 同 Python3: 'str'.center()

func PadBytes

func PadBytes(s, pad []byte, n int) []byte

PadBytes 填充到指定长度

func ParseHostPort

func ParseHostPort(s string) (net.IP, uint16, bool, error)

ParseHostPort 解析 IP 和端口

func ParseHumanBigBytes

func ParseHumanBigBytes(s string) (*big.Int, error)

ParseHumanBigBytes parses a string representation of bytes into the number of bytes it represents.

See also: HumanBigBytes, HumanBigIBytes.

ParseHumanBigBytes("42 MB") -> 42000000, nil ParseHumanBigBytes("42 mib") -> 44040192, nil

func ParseHumanBytes

func ParseHumanBytes(s string) (uint64, error)

ParseHumanBytes 解析数字的数量级表示 e.g. ParseHumanBytes("42 MB") -> 42000000, nil e.g. ParseHumanBytes("42 mib") -> 44040192, nil

func ParseIP

func ParseIP(s string) (net.IP, bool)

ParseIP 解析 IP 并返回是否为 IPv6

func ParseIPv4

func ParseIPv4(ip string) net.IP

ParseIPv4 判断是否为合法 IPv4 并解析

func ParseIPv6

func ParseIPv6(ip string) net.IP

ParseIPv6 判断是否为合法 IPv6 并解析

func ParseIPx

func ParseIPx(s string) (net.IP, bool)

ParseIPx 解析 IP, 并返回是否为 IPv6

func ParseIPxWithNumeric

func ParseIPxWithNumeric(s string) (net.IP, bool)

ParseIPxWithNumeric 解析 IP, 支持数字形态, 并返回是否为 IPv6

func ParseInts

func ParseInts(s string) ([]int, error)

ParseInts 解析字符串, 得到去重并排序后的数字列表 "5,0-3, 3" => [0,1,2,3,5]

func RandAlphaBytes

func RandAlphaBytes(n int) []byte

RandAlphaBytes generates random alpha bytes.

func RandAlphaString

func RandAlphaString(n int) string

RandAlphaString 指定长度的随机字母字符串

func RandBytes

func RandBytes(n int) []byte

RandBytes random bytes, but faster.

func RandBytesLetters

func RandBytesLetters(n int, letters string) []byte

RandBytesLetters 生成指定长度的字符切片

func RandDecBytes

func RandDecBytes(n int) []byte

RandDecBytes 指定长度的随机数字切片

func RandDecString

func RandDecString(n int) string

RandDecString 指定长度的随机数字字符串

func RandHexBytes

func RandHexBytes(n int) []byte

RandHexBytes generates random hexadecimal bytes.

func RandHexString

func RandHexString(n int) string

RandHexString 指定长度的随机 hex 字符串

func RandInt

func RandInt(min, max int) int

RandInt (>=)min - (<)max

func RandString

func RandString(n int) string

RandString a random string, which may contain uppercase letters, lowercase letters and numbers. Ref: stackoverflow.icza

func RandUint32

func RandUint32(min, max uint32) uint32

RandUint32 (>=)min - (<)max

func Recover

func Recover(cb ...RecoveryCallback)

Recover 从 panic 中恢复并记录堆栈信息

func RemoveString

func RemoveString(ss []string, s string) ([]string, bool)

RemoveString 删除字符串元素

func ReplaceHost

func ReplaceHost(a, b string) string

ReplaceHost 返回 b 的主机名 + a 的端口 e.g. ReplaceHost("a.cn:77", "b.cn:88") == "b.cn:77"

func Reverse

func Reverse(s string) string

Reverse 反转字符串

func RightPad

func RightPad(s, pad string, n int) string

RightPad 从右填充字符串到指定长度

func RightPadBytes

func RightPadBytes(b, pad []byte, n int) []byte

RightPadBytes 从右填充到指定长度

func Round

func Round(v float64, precision int) float64

Round 四舍五入, ROUND_HALF_UP 模式实现 返回将 val 根据指定精度 precision (十进制小数点后数字的数目) 进行四舍五入的结果 precision 也可以是负数或零 Ref: thinkeridea/go-extend

func RunPath

func RunPath() string

RunPath 实际程序所在目录 RunPath: E:\tmp

func RuneReverse

func RuneReverse(s string) string

RuneReverse 反转多字节字符串

func RuneSubString

func RuneSubString(s string, length int, suffix string) string

RuneSubString 多字节字符串截取 长度支持 0(空字符串) / >0(正常截取) / <0(从结尾处往前截取) 长度等于或超过字符串长度, 返回原字符串值, 此时忽略 suffix 参数

func S2B

func S2B(s string) []byte

S2B converts string to byte slice without a memory allocation. Ref: https://github.com/golang/go/issues/53003#issuecomment-1140276077

func SafeGo

func SafeGo(fn func(), cb ...RecoveryCallback)

SafeGo 带 Recover 的 goroutine 运行

func SafeGoCommonFunc

func SafeGoCommonFunc(args interface{}, fn func(args interface{}), cb ...RecoveryCallback)

SafeGoCommonFunc 带 Recover 的 goroutine 运行

func SafeGoWithContext

func SafeGoWithContext(ctx context.Context, fn func(ctx context.Context), cb ...RecoveryCallback)

SafeGoWithContext 带 Recover 的 goroutine 运行

func SearchInt

func SearchInt(slice []int, n int) int

SearchInt 搜索整数位置(左, 第一个)

func SearchString

func SearchString(ss []string, s string) int

SearchString 搜索字符串位置(左, 第一个) 用 slices.Index 替代

func Sleep

func Sleep(ctx context.Context, interval time.Duration) error

Sleep 支持上下文中断的 time.Sleep

func SplitHostPort

func SplitHostPort(hostPort string) (host, port string)

SplitHostPort separates host and port. If the port is not valid, it returns the entire input as host, and it doesn't check the validity of the host. Unlike net.SplitHostPort, but per RFC 3986, it requires ports to be numeric.

func SumInt

func SumInt(v ...int) int

SumInt 整数和

func ToLower

func ToLower(b string) string

ToLower converts ascii string to lower-case Ref: fiber

func ToLowerBytes

func ToLowerBytes(b []byte) []byte

ToLowerBytes converts ascii slice to lower-case Ref: fiber

func ToUpper

func ToUpper(b string) string

ToUpper converts ascii string to upper-case Ref: fiber

func ToUpperBytes

func ToUpperBytes(b []byte) []byte

ToUpperBytes converts ascii slice to upper-case Ref: fiber

func Trim

func Trim(s string, cutset byte) string

Trim is the equivalent of strings.Trim Ref: fiber

func TrimBytes

func TrimBytes(b []byte, cutset byte) []byte

TrimBytes is the equivalent of bytes.Trim Ref: fiber

func TrimLeft

func TrimLeft(s string, cutset byte) string

TrimLeft is the equivalent of strings.TrimLeft Ref: fiber

func TrimLeftBytes

func TrimLeftBytes(b []byte, cutset byte) []byte

TrimLeftBytes is the equivalent of bytes.TrimLeft Ref: fiber

func TrimRight

func TrimRight(s string, cutset byte) string

TrimRight is the equivalent of strings.TrimRight Ref: fiber

func TrimRightBytes

func TrimRightBytes(b []byte, cutset byte) []byte

TrimRightBytes is the equivalent of bytes.TrimRight Ref: fiber

func TrimSlice

func TrimSlice(ss []string) []string

TrimSlice 清除 slice 中各元素的空白, 并删除空白项 注意: 原切片将被修改

func TruncStr

func TruncStr(s string, maxLen int, suffix string) string

TruncStr 截断字符串

func UUID

func UUID() []byte

UUID 随机 UUID, RFC4122, Version 4

func UUIDShort

func UUIDShort() string

UUIDShort 随机 UUID, 短版, base58

func UUIDSimple

func UUIDSimple() string

UUIDSimple 随机 UUID, 无短横线

func UUIDString

func UUIDString() string

UUIDString 随机 UUID

func Ungzip

func Ungzip(data []byte) (src []byte, err error)

func Unzip

func Unzip(data []byte) (src []byte, err error)

func ValidOptionalPort

func ValidOptionalPort(port string) bool

ValidOptionalPort reports whether port is either an empty string or matches /^:\d*$/

func WaitNextMinute

func WaitNextMinute(t ...time.Time)

WaitNextMinute 下一分钟, 对齐时间, 0 秒

func WaitNextMinuteWithTime

func WaitNextMinuteWithTime(t ...time.Time) (now time.Time)

WaitNextMinuteWithTime 下一分钟, 对齐时间, 0 秒

func WaitNextSecond

func WaitNextSecond(t ...time.Time)

WaitNextSecond 下一秒, 对齐时间, 0 毫秒 (近似)

func WaitNextSecondWithTime

func WaitNextSecondWithTime(t ...time.Time) (now time.Time)

WaitNextSecondWithTime 下一秒, 对齐时间, 0 毫秒 (近似)

func WaitSignal

func WaitSignal(sig ...os.Signal) os.Signal

WaitSignal 等待系统信号 默认捕获退出类信息

func WaitUntilMinute

func WaitUntilMinute(m int, t ...time.Time)

WaitUntilMinute 等待, 直到 m 分钟

func WaitUntilSecond

func WaitUntilSecond(s int, t ...time.Time)

WaitUntilSecond 等待, 直到 s 秒

func Zip

func Zip(data []byte) ([]byte, error)

func ZipLevel

func ZipLevel(data []byte, level int) (dst []byte, err error)

Types

type Bool

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

A Bool is an atomic boolean value. The zero value is false.

func NewBool

func NewBool(val bool) *Bool

func NewFalse

func NewFalse() *Bool

func NewTrue

func NewTrue() *Bool

func (*Bool) CAS

func (x *Bool) CAS(old, new bool) bool

func (*Bool) CompareAndSwap

func (x *Bool) CompareAndSwap(old, new bool) (swapped bool)

CompareAndSwap executes the compare-and-swap operation for the boolean value x.

func (*Bool) Load

func (x *Bool) Load() bool

Load atomically loads and returns the value stored in x.

func (*Bool) MarshalJSON

func (x *Bool) MarshalJSON() ([]byte, error)

func (*Bool) Store

func (x *Bool) Store(val bool)

Store atomically stores val into x.

func (*Bool) StoreFalse

func (x *Bool) StoreFalse()

func (*Bool) StoreTrue

func (x *Bool) StoreTrue()

func (*Bool) String

func (x *Bool) String() string

func (*Bool) Swap

func (x *Bool) Swap(new bool) (old bool)

Swap atomically stores new into x and returns the previous value.

func (*Bool) Toggle

func (x *Bool) Toggle() (old bool)

Toggle atomically negates the Boolean and returns the previous value

func (*Bool) UnmarshalJSON

func (x *Bool) UnmarshalJSON(b []byte) error

type NoCmp

type NoCmp [0]func()

NoCmp is an uncomparable struct. Embed this inside another struct to make it uncomparable.

type Foo struct {
  NoCmp
  // ...
}

This DOES NOT:

  • Disallow shallow copies of structs
  • Disallow comparison of pointers to uncomparable structs

type NoCopy

type NoCopy struct{} //nolint:unused

NoCopy may be added to structs which must not be copied after the first use.

See https://github.com/golang/go/issues/8005#issuecomment-190753527 for details. and also: https://stackoverflow.com/questions/52494458/nocopy-minimal-example

Note that it must not be embedded, due to the Lock and Unlock methods.

func (*NoCopy) Lock

func (*NoCopy) Lock()

Lock is a no-op used by -copylocks checker from `go vet`.

func (*NoCopy) Unlock

func (*NoCopy) Unlock()

type RecoveryCallback

type RecoveryCallback func(err interface{}, trace []byte)

RecoveryCallback 自定义恢复信息回调

type TryMutex

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

func NewTryMutex

func NewTryMutex() *TryMutex

func (*TryMutex) Lock

func (m *TryMutex) Lock()

func (*TryMutex) TryLock

func (m *TryMutex) TryLock(timeout ...time.Duration) bool

TryLock 实现可选等待时间尝试获取锁

func (*TryMutex) Unlock

func (m *TryMutex) Unlock()

Directories

Path Synopsis
Package base58 provides an API for working with modified base58 and Base58Check encodings.
Package base58 provides an API for working with modified base58 and Base58Check encodings.
环境变量加密工具 go run main.go -d=Fufu go run main.go -d="Fufu 777" go run main.go -d=Fufu -k=TestEnv go run main.go -k=TestEnv go run main.go -u=db_user -p='abc!@#$%^&*()_+ ?><'
环境变量加密工具 go run main.go -d=Fufu go run main.go -d="Fufu 777" go run main.go -d=Fufu -k=TestEnv go run main.go -k=TestEnv go run main.go -u=db_user -p='abc!@#$%^&*()_+ ?><'
Package generic defines a set of useful constraints to be used with type parameters.
Package generic defines a set of useful constraints to be used with type parameters.
deepcopy
License: MIT, for more details check the included LICENSE file.
License: MIT, for more details check the included LICENSE file.
pools
examples/auto_restart
本示例, 将启动一个后台运行的守护进程.
本示例, 将启动一个后台运行的守护进程.
examples/background
本示例, 将把进程转为后台运行, 并保留所有参数不变
本示例, 将把进程转为后台运行, 并保留所有参数不变
Package xid is a globally unique id generator suited for web scale
Package xid is a globally unique id generator suited for web scale
gjson
Package gjson provides searching for json strings.
Package gjson provides searching for json strings.
jsongen
Package jsongen forked from darjun/json-gen
Package jsongen forked from darjun/json-gen
match
Package match provides a simple pattern matcher with unicode support.
Package match provides a simple pattern matcher with unicode support.
sjson
Package sjson provides setting json values.
Package sjson provides setting json values.

Jump to

Keyboard shortcuts

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