utils

package module
v1.2.0 Latest Latest
Warning

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

Go to latest
Published: Jul 8, 2024 License: MIT Imports: 34 Imported by: 26

README

Go-Utils

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

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

安装

go get github.com/fufuok/utils

目录

常用函数
DOC
package utils // import "github.com/fufuok/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/fufuok/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/fufuok/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/fufuok/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/fufuok/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/fufuok/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/fufuok/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/fufuok/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/fufuok/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 生成器, 不再需要之前的改动, 直接使用官方原版就好

如果要在 go1.18 以下使用, 可以使用: github.com/fufuok/xsync@v1.3.1

DOC
package xsync // import "github.com/fufuok/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/fufuok/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/fufuok/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/fufuok/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/fufuok/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/fufuok/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/fufuok/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/fufuok/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/fufuok/utils/pools/readerpool"

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

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

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

package tickerpool // import "github.com/fufuok/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/fufuok/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/fufuok/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/fufuok/utils"
	"github.com/fufuok/utils/assert"
	"github.com/fufuok/utils/base58"
	"github.com/fufuok/utils/base62"
	"github.com/fufuok/utils/conv"
	"github.com/fufuok/utils/pools/bufferpool"
	"github.com/fufuok/utils/sched"
	"github.com/fufuok/utils/xcrypto"
	"github.com/fufuok/utils/xhash"
	"github.com/fufuok/utils/xid"
	"github.com/fufuok/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.")
}

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 (
	// 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 added in v0.4.0

func BeginOfDay(t time.Time) time.Time

BeginOfDay 当天 0 点

func BeginOfHour added in v0.4.0

func BeginOfHour(t time.Time) time.Time

BeginOfHour 0 分

func BeginOfLastMonth added in v0.4.0

func BeginOfLastMonth(t time.Time) time.Time

BeginOfLastMonth 上月第一天 0 点

func BeginOfLastWeek added in v0.4.0

func BeginOfLastWeek(t time.Time) time.Time

BeginOfLastWeek 上周一 0 点

func BeginOfMinute added in v0.4.0

func BeginOfMinute(t time.Time) time.Time

BeginOfMinute 0 秒

func BeginOfMonth added in v0.4.0

func BeginOfMonth(t time.Time) time.Time

BeginOfMonth 当月第一天 0 点

func BeginOfNextMonth added in v0.4.0

func BeginOfNextMonth(t time.Time) time.Time

BeginOfNextMonth 下月第一天 0 点

func BeginOfNextWeek added in v0.4.0

func BeginOfNextWeek(t time.Time) time.Time

BeginOfNextWeek 下周一 0 点

func BeginOfSecond added in v0.9.6

func BeginOfSecond(t time.Time) time.Time

BeginOfSecond 0 毫秒

func BeginOfTomorrow added in v0.4.0

func BeginOfTomorrow(t time.Time) time.Time

BeginOfTomorrow 明天 0 点

func BeginOfWeek added in v0.4.0

func BeginOfWeek(t time.Time) time.Time

BeginOfWeek 本周一 0 点

func BeginOfYear added in v0.4.0

func BeginOfYear(t time.Time) time.Time

BeginOfYear 本年第一天 0 点

func BeginOfYesterday added in v0.4.0

func BeginOfYesterday(t time.Time) time.Time

BeginOfYesterday 昨天 0 点

func BigComma added in v0.1.3

func BigComma(b *big.Int) string

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

func BigCommaf added in v0.1.3

func BigCommaf(v *big.Float) string

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

func Bigoom added in v0.1.3

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

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

func CPUTicks added in v0.3.3

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 Comma added in v0.1.3

func Comma(v int64) string

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

func Commaf added in v0.1.3

func Commaf(v float64) string

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

func Commai added in v0.1.4

func Commai(v int) string

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

func Commau added in v0.1.3

func Commau(v uint64) string

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

func CopyB2S added in v0.1.2

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 added in v0.1.2

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 added in v0.5.0

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 added in v0.5.0

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 added in v0.11.1

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

DaysInMonth 返回月份天数

func DaysInYear added in v0.9.11

func DaysInYear(year int) int

DaysInYear 返回年份天数

func EncodeUUID added in v0.0.3

func EncodeUUID(id []byte) []byte

EncodeUUID 编码 UUID

func EndOfDay added in v0.4.0

func EndOfDay(t time.Time) time.Time

EndOfDay 当天最后时刻

func EndOfHour added in v0.4.0

func EndOfHour(t time.Time) time.Time

EndOfHour 最后一分

func EndOfLastMonth added in v0.4.0

func EndOfLastMonth(t time.Time) time.Time

EndOfLastMonth 上月最后一刻

func EndOfLastWeek added in v0.4.0

func EndOfLastWeek(t time.Time) time.Time

EndOfLastWeek 上周一最后一刻

func EndOfMinute added in v0.4.0

func EndOfMinute(t time.Time) time.Time

EndOfMinute 最后一秒

func EndOfMonth added in v0.4.0

func EndOfMonth(t time.Time) time.Time

EndOfMonth 当月最后一刻

func EndOfNextMonth added in v0.4.0

func EndOfNextMonth(t time.Time) time.Time

EndOfNextMonth 下月最后一刻

func EndOfNextWeek added in v0.4.0

func EndOfNextWeek(t time.Time) time.Time

EndOfNextWeek 下周一最后一刻

func EndOfSecond added in v0.9.6

func EndOfSecond(t time.Time) time.Time

EndOfSecond 最后一毫秒

func EndOfTomorrow added in v0.4.0

func EndOfTomorrow(t time.Time) time.Time

EndOfTomorrow 明天 0 点

func EndOfWeek added in v0.4.0

func EndOfWeek(t time.Time) time.Time

EndOfWeek 本周末最后一刻

func EndOfYear added in v0.4.0

func EndOfYear(t time.Time) time.Time

EndOfYear 本年最后一刻

func EndOfYesterday added in v0.4.0

func EndOfYesterday(t time.Time) time.Time

EndOfYesterday 昨天最后时刻

func EqualFold added in v0.3.2

func EqualFold(b, s string) bool

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

func EqualFoldBytes added in v0.3.2

func EqualFoldBytes(b, s []byte) bool

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

func Executable added in v0.1.2

func Executable(evalSymlinks ...bool) string

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

func ExecutableDir added in v0.1.2

func ExecutableDir(evalSymlinks ...bool) string

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

func FastIntn added in v0.3.3

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 added in v0.3.3

func FastRand() uint32

FastRand 随机数

func FastRand64 added in v0.8.1

func FastRand64() uint64

func FastRandn added in v0.3.3

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 added in v0.8.1

func FastRandu() uint

func GetBytes

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

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

func GetIPPort added in v0.2.0

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 added in v0.1.5

func GetMonthDays(t time.Time) int

GetMonthDays 当月天数

func GetNotInternalIPv4 added in v0.1.5

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

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

func GetNotInternalIPv4String added in v0.1.5

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

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

func GetSafeB2S added in v0.1.1

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

GetSafeB2S Immutable, 可选指定默认值

func GetSafeBytes added in v0.1.1

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

GetSafeBytes Immutable, 可选指定默认值

func GetSafeS2B added in v0.1.1

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

GetSafeS2B Immutable, 可选指定默认值

func GetSafeString added in v0.1.1

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

GetSafeString Immutable, 可选指定默认值

func GetString

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

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

func GoroutineID added in v0.12.0

func GoroutineID() (uint64, error)

GoroutineID 获取 Goroutine ID

func Gzip added in v0.7.6

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

func GzipLevel added in v0.7.6

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

func HumanBaseBytes added in v0.1.3

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

HumanBaseBytes 数字的数量级表示

func HumanBigBytes added in v0.1.11

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 added in v0.1.11

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 added in v0.1.11

func HumanBigKbps(s *big.Int) string

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

func HumanBytes added in v0.1.3

func HumanBytes(v uint64) string

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

func HumanGBMB added in v0.4.2

func HumanGBMB(v uint64) string

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

func HumanIBytes added in v0.1.3

func HumanIBytes(v uint64) string

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

func HumanIntBytes added in v0.1.4

func HumanIntBytes(v int) string

HumanIntBytes 1 KB = 1000 B

func HumanIntIBytes added in v0.1.4

func HumanIntIBytes(v int) string

HumanIntIBytes 1 KiB = 1024 B

func HumanIntKbps added in v0.1.11

func HumanIntKbps(v int) string

HumanIntKbps 1 Kbps = 1000 bit

func HumanKbps added in v0.1.11

func HumanKbps(v uint64) string

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

func ID added in v0.5.0

func ID() uint64

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

func IPv42Long added in v0.1.5

func IPv42Long(ip net.IP) int

IPv42Long IPv4 转数值

func IPv42LongLittle added in v0.7.16

func IPv42LongLittle(ip net.IP) int

IPv42LongLittle IPv4 转小端数值

func IPv4String2Long added in v0.1.5

func IPv4String2Long(ip string) int

IPv4String2Long IPv4 字符串转数值

func IPv4String2LongLittle added in v0.7.16

func IPv4String2LongLittle(ip string) int

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

func IPv62Int added in v1.0.6

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

IPv62Int IPv6 转数值

func IPv6String2Int added in v1.0.6

func IPv6String2Int(ip string) *big.Int

IPv6String2Int IPv6 字符串转数值

func InIPNet added in v0.1.14

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

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

func InIPNetString added in v0.1.14

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 added in v0.9.11

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 不一定是中国时区

func InitLocation added in v0.9.11

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

InitLocation 解析并初始化本地时区

func Int2IPv6 added in v1.0.6

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

Int2IPv6 数值转 IPv4

func Int2IPv6String added in v1.0.6

func Int2IPv6String(n *big.Int) string

Int2IPv6String 数值转 IPv6 字符串

func IsIP added in v0.7.2

func IsIP(ip string) bool

IsIP 判断是否为合法 IPv4 / IPv6

func IsIPv4 added in v0.7.2

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 added in v0.7.2

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 added in v0.1.5

func IsInternalIPv4(ip net.IP) bool

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

func IsInternalIPv4String added in v0.1.5

func IsInternalIPv4String(ip string) bool

IsInternalIPv4String 是否为内网 IPv4

func IsLeapYear added in v0.9.11

func IsLeapYear(year int) bool

IsLeapYear 判断是否为闰年

func IsNumeric added in v1.0.5

func IsNumeric(s string) bool

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

func IsPrivateIP added in v0.2.1

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 added in v0.2.1

func IsPrivateIPString(ip string) bool

IsPrivateIPString 是否为私有 IP

func JoinBytes

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

JoinBytes 拼接 []byte

func JoinString added in v0.9.4

func JoinString(s ...string) string

JoinString 拼接字符串

func JoinStringBytes added in v0.9.4

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

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

func LeftPad added in v0.3.15

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

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

func LeftPadBytes added in v0.3.15

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

LeftPadBytes 从左填充到指定长度

func Logn added in v0.1.3

func Logn(n, b float64) float64

func Long2IPv4 added in v0.1.5

func Long2IPv4(n int) net.IP

Long2IPv4 数值转 IPv4

func Long2IPv4String added in v0.1.5

func Long2IPv4String(n int) string

Long2IPv4String 数值转 IPv4 字符串

func LongLittle2IPv4 added in v0.7.16

func LongLittle2IPv4(n int) net.IP

LongLittle2IPv4 小端数值转 IPv4

func LongLittle2IPv4String added in v0.7.16

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 added in v0.1.7

func MustJSONIndent(v interface{}) []byte

MustJSONIndent 转 json 返回 []byte

func MustJSONIndentString added in v0.1.7

func MustJSONIndentString(v interface{}) string

MustJSONIndentString 转 json Indent 返回 string

func MustJSONString

func MustJSONString(v interface{}) string

MustJSONString 转 json 返回 string

func MustParseHumanBigBytes added in v0.3.13

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 added in v0.3.13

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 added in v0.3.3

func NanoTime() int64

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

func NewRand added in v0.3.3

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

NewRand goroutine-safe rand.Rand, optional seed value

func Pad added in v0.3.15

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

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

func PadBytes added in v0.3.15

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

PadBytes 填充到指定长度

func ParseHostPort added in v0.7.17

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

ParseHostPort 解析 IP 和端口

func ParseHumanBigBytes added in v0.1.11

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 added in v0.1.3

func ParseHumanBytes(s string) (uint64, error)

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

func ParseIP added in v0.7.17

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

ParseIP 解析 IP 并返回是否为 IPv6

func ParseIPv4 added in v0.7.2

func ParseIPv4(ip string) net.IP

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

func ParseIPv6 added in v0.7.2

func ParseIPv6(ip string) net.IP

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

func ParseIPx added in v1.0.5

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

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

func ParseIPxWithNumeric added in v1.0.7

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

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

func ParseInts added in v0.9.13

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

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

func RandAlphaBytes added in v1.1.0

func RandAlphaBytes(n int) []byte

RandAlphaBytes generates random alpha bytes.

func RandAlphaString added in v1.1.0

func RandAlphaString(n int) string

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

func RandBytes added in v0.0.3

func RandBytes(n int) []byte

RandBytes random bytes, but faster.

func RandBytesLetters added in v1.1.0

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

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

func RandDecBytes added in v1.1.0

func RandDecBytes(n int) []byte

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

func RandDecString added in v1.1.0

func RandDecString(n int) string

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

func RandHexBytes added in v1.1.0

func RandHexBytes(n int) []byte

RandHexBytes generates random hexadecimal bytes.

func RandHexString added in v1.1.0

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 added in v0.3.3

func RandUint32(min, max uint32) uint32

RandUint32 (>=)min - (<)max

func Recover added in v0.7.16

func Recover(cb ...RecoveryCallback)

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

func RemoveString added in v0.3.0

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

RemoveString 删除字符串元素

func ReplaceHost added in v0.3.2

func ReplaceHost(a, b string) string

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

func Reverse added in v0.12.0

func Reverse(s string) string

Reverse 反转字符串

func RightPad added in v0.3.15

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

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

func RightPadBytes added in v0.3.15

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 added in v0.12.0

func RuneReverse(s string) string

RuneReverse 反转多字节字符串

func RuneSubString added in v0.12.0

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 added in v0.7.16

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

SafeGo 带 Recover 的 goroutine 运行

func SafeGoCommonFunc added in v0.13.2

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

SafeGoCommonFunc 带 Recover 的 goroutine 运行

func SafeGoWithContext added in v0.13.1

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 added in v0.9.7

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

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

func SplitHostPort added in v0.3.2

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 added in v0.3.3

func SumInt(v ...int) int

SumInt 整数和

func ToLower added in v0.3.2

func ToLower(b string) string

ToLower converts ascii string to lower-case Ref: fiber

func ToLowerBytes added in v0.3.2

func ToLowerBytes(b []byte) []byte

ToLowerBytes converts ascii slice to lower-case Ref: fiber

func ToUpper added in v0.3.2

func ToUpper(b string) string

ToUpper converts ascii string to upper-case Ref: fiber

func ToUpperBytes added in v0.3.2

func ToUpperBytes(b []byte) []byte

ToUpperBytes converts ascii slice to upper-case Ref: fiber

func Trim added in v0.3.2

func Trim(s string, cutset byte) string

Trim is the equivalent of strings.Trim Ref: fiber

func TrimBytes added in v0.3.2

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

TrimBytes is the equivalent of bytes.Trim Ref: fiber

func TrimLeft added in v0.3.2

func TrimLeft(s string, cutset byte) string

TrimLeft is the equivalent of strings.TrimLeft Ref: fiber

func TrimLeftBytes added in v0.3.2

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

TrimLeftBytes is the equivalent of bytes.TrimLeft Ref: fiber

func TrimRight added in v0.3.2

func TrimRight(s string, cutset byte) string

TrimRight is the equivalent of strings.TrimRight Ref: fiber

func TrimRightBytes added in v0.3.2

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

TrimRightBytes is the equivalent of bytes.TrimRight Ref: fiber

func TrimSlice added in v0.9.12

func TrimSlice(ss []string) []string

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

func UUID added in v0.0.3

func UUID() []byte

UUID 随机 UUID, RFC4122, Version 4

func UUIDShort added in v0.0.3

func UUIDShort() string

UUIDShort 随机 UUID, 短版, base58

func UUIDSimple added in v0.0.3

func UUIDSimple() string

UUIDSimple 随机 UUID, 无短横线

func UUIDString added in v0.0.3

func UUIDString() string

UUIDString 随机 UUID

func Ungzip added in v0.7.6

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

func Unzip added in v0.3.4

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

func ValidOptionalPort added in v0.3.2

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 added in v0.9.6

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

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

func WaitNextSecond added in v0.9.6

func WaitNextSecond(t ...time.Time)

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

func WaitNextSecondWithTime added in v0.9.6

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

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

func WaitSignal added in v0.7.16

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

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

func WaitUntilMinute added in v1.0.10

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

WaitUntilMinute 等待, 直到 m 分钟

func WaitUntilSecond added in v1.0.10

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

WaitUntilSecond 等待, 直到 s 秒

func Zip added in v0.3.4

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

func ZipLevel added in v0.3.7

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

Types

type Bool added in v0.5.1

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

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

func NewBool added in v0.5.1

func NewBool(val bool) *Bool

func NewFalse added in v0.5.1

func NewFalse() *Bool

func NewTrue added in v0.5.1

func NewTrue() *Bool

func (*Bool) CAS added in v0.5.1

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

func (*Bool) CompareAndSwap added in v0.5.2

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

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

func (*Bool) Load added in v0.5.1

func (x *Bool) Load() bool

Load atomically loads and returns the value stored in x.

func (*Bool) MarshalJSON added in v0.5.1

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

func (*Bool) Store added in v0.5.1

func (x *Bool) Store(val bool)

Store atomically stores val into x.

func (*Bool) StoreFalse added in v0.5.1

func (x *Bool) StoreFalse()

func (*Bool) StoreTrue added in v0.5.1

func (x *Bool) StoreTrue()

func (*Bool) String added in v0.5.1

func (x *Bool) String() string

func (*Bool) Swap added in v0.5.1

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

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

func (*Bool) Toggle added in v0.5.1

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

Toggle atomically negates the Boolean and returns the previous value

func (*Bool) UnmarshalJSON added in v0.5.1

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

type NoCmp added in v0.5.2

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 added in v0.5.2

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 added in v0.5.2

func (*NoCopy) Lock()

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

func (*NoCopy) Unlock added in v0.5.2

func (*NoCopy) Unlock()

type RecoveryCallback added in v0.7.16

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

RecoveryCallback 自定义恢复信息回调

type TryMutex added in v0.9.0

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

func NewTryMutex added in v0.9.0

func NewTryMutex() *TryMutex

func (*TryMutex) Lock added in v0.9.0

func (m *TryMutex) Lock()

func (*TryMutex) TryLock added in v0.9.0

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

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

func (*TryMutex) Unlock added in v0.9.0

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