{"id":17335773,"url":"https://github.com/fufuok/utils","last_synced_at":"2025-08-21T17:32:09.376Z","repository":{"id":37651249,"uuid":"357039603","full_name":"fufuok/utils","owner":"fufuok","description":"🎉 Utilities for go  (常用的助手函数, 0 依赖, 性能至上)","archived":false,"fork":false,"pushed_at":"2024-12-04T14:48:36.000Z","size":937,"stargazers_count":36,"open_issues_count":0,"forks_count":4,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-12-04T15:23:38.701Z","etag":null,"topics":["pkg","utils"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fufuok.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-04-12T03:00:08.000Z","updated_at":"2024-12-04T14:50:51.000Z","dependencies_parsed_at":"2023-09-27T08:35:21.049Z","dependency_job_id":"5d1f0568-1cc0-4369-be88-cdf81f61d2f9","html_url":"https://github.com/fufuok/utils","commit_stats":null,"previous_names":[],"tags_count":127,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fufuok%2Futils","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fufuok%2Futils/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fufuok%2Futils/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fufuok%2Futils/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fufuok","download_url":"https://codeload.github.com/fufuok/utils/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":230523761,"owners_count":18239445,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["pkg","utils"],"created_at":"2024-10-15T15:12:07.249Z","updated_at":"2025-08-21T17:32:09.343Z","avatar_url":"https://github.com/fufuok.png","language":"Go","readme":"# Go-Utils\n\nGo 常用的助手函数, 0 依赖, 性能至上.\n\n若有直接引用的, 会在函数定义或目录 README 中注明来源, 并保留 LICENSE, 感谢之!\n\n## 安装\n\n```shell\ngo get github.com/fufuok/utils\n```\n\n## 目录\n\n### 常用函数\n\n\u003cdetails\u003e\n  \u003csummary\u003eDOC\u003c/summary\u003e\n\n```go\npackage utils // import \"github.com/fufuok/utils\"\n\nconst Byte = 1 \u003c\u003c (iota * 10) ...\nconst IByte = 1 ...\nconst IPv4Min = 0 ...\nconst ChinaTimeZone = \"UTC+8\" ...\nconst PtrSize = 4 \u003c\u003c (^uintptr(0) \u003e\u003e 63)\nvar BigByte ...\nvar BigSIByte ...\nvar Rand = NewRand() ...\nvar ChinaTimeLocation = time.FixedZone(ChinaTimeZone, ChinaTimeOffset)\nvar ErrInvalidHostPort = errors.New(\"invalid Host or Port\")\nvar StackTraceBufferSize = 4 \u003c\u003c 10\nfunc B2S(b []byte) string\nfunc B64Decode(s string) []byte\nfunc B64Encode(b []byte) string\nfunc B64UrlDecode(s string) []byte\nfunc B64UrlEncode(b []byte) string\nfunc BeginOfDay(t time.Time) time.Time\nfunc BeginOfHour(t time.Time) time.Time\nfunc BeginOfLastMonth(t time.Time) time.Time\nfunc BeginOfLastWeek(t time.Time) time.Time\nfunc BeginOfMinute(t time.Time) time.Time\nfunc BeginOfMonth(t time.Time) time.Time\nfunc BeginOfNextMonth(t time.Time) time.Time\nfunc BeginOfNextWeek(t time.Time) time.Time\nfunc BeginOfSecond(t time.Time) time.Time\nfunc BeginOfTomorrow(t time.Time) time.Time\nfunc BeginOfWeek(t time.Time) time.Time\nfunc BeginOfYear(t time.Time) time.Time\nfunc BeginOfYesterday(t time.Time) time.Time\nfunc BigComma(b *big.Int) string\nfunc BigCommaf(v *big.Float) string\nfunc Bigoom(n, b *big.Int) (float64, int)\nfunc CPUTicks() int64\nfunc CallPath() string\nfunc CheckDomain(name string) error\nfunc Comma(v int64) string\nfunc Commaf(v float64) string\nfunc Commai(v int) string\nfunc Commau(v uint64) string\nfunc CopyB2S(b []byte) string\nfunc CopyBytes(b []byte) []byte\nfunc CopyS2B(s string) []byte\nfunc CopyString(s string) string\nfunc CutBytes(s, sep []byte) (before, after []byte, found bool)\nfunc CutString(s, sep string) (before, after string, found bool)\nfunc DaysInMonth(year int, m time.Month) int\nfunc DaysInYear(year int) int\nfunc EncodeUUID(id []byte) []byte\nfunc EndOfDay(t time.Time) time.Time\nfunc EndOfHour(t time.Time) time.Time\nfunc EndOfLastMonth(t time.Time) time.Time\nfunc EndOfLastWeek(t time.Time) time.Time\nfunc EndOfMinute(t time.Time) time.Time\nfunc EndOfMonth(t time.Time) time.Time\nfunc EndOfNextMonth(t time.Time) time.Time\nfunc EndOfNextWeek(t time.Time) time.Time\nfunc EndOfSecond(t time.Time) time.Time\nfunc EndOfTomorrow(t time.Time) time.Time\nfunc EndOfWeek(t time.Time) time.Time\nfunc EndOfYear(t time.Time) time.Time\nfunc EndOfYesterday(t time.Time) time.Time\nfunc EqualFold(b, s string) bool\nfunc EqualFoldBytes(b, s []byte) bool\nfunc Executable(evalSymlinks ...bool) string\nfunc ExecutableDir(evalSymlinks ...bool) string\nfunc FastIntn(n int) int\nfunc FastRand() uint32\nfunc FastRand64() uint64\nfunc FastRandn(n uint32) uint32\nfunc FastRandu() uint\nfunc FirstString(s, sep string, defaultStr ...string) string\nfunc GetBytes(v interface{}, defaultVal ...[]byte) []byte\nfunc GetDomain(name string) string\nfunc GetIPPort(addr net.Addr) (ip net.IP, port int, err error)\nfunc GetInt(v interface{}, defaultInt ...int) int\nfunc GetMonthDays(t time.Time) int\nfunc GetNotInternalIPv4(ip, defaultIP net.IP, flag ...bool) net.IP\nfunc GetNotInternalIPv4String(ip, defaultIP string, flag ...bool) string\nfunc GetSafeB2S(b []byte, defaultVal ...string) string\nfunc GetSafeBytes(b []byte, defaultVal ...[]byte) []byte\nfunc GetSafeS2B(s string, defaultVal ...[]byte) []byte\nfunc GetSafeString(s string, defaultVal ...string) string\nfunc GetString(v interface{}, defaultVal ...string) string\nfunc GoroutineID() (uint64, error)\nfunc Gzip(data []byte) ([]byte, error)\nfunc GzipLevel(data []byte, level int) (dst []byte, err error)\nfunc HumanBaseBytes(v uint64, base float64, sizes []string) string\nfunc HumanBigBytes(s *big.Int) string\nfunc HumanBigIBytes(s *big.Int) string\nfunc HumanBigKbps(s *big.Int) string\nfunc HumanBytes(v uint64) string\nfunc HumanGBMB(v uint64) string\nfunc HumanIBytes(v uint64) string\nfunc HumanIntBytes(v int) string\nfunc HumanIntIBytes(v int) string\nfunc HumanIntKbps(v int) string\nfunc HumanKbps(v uint64) string\nfunc ID() uint64\nfunc IPv42Long(ip net.IP) int\nfunc IPv42LongLittle(ip net.IP) int\nfunc IPv4String2Long(ip string) int\nfunc IPv4String2LongLittle(ip string) int\nfunc IPv62Int(ip net.IP) *big.Int\nfunc IPv6String2Int(ip string) *big.Int\nfunc InIPNet(ip net.IP, ipNets map[*net.IPNet]struct{}) bool\nfunc InIPNetString(ip string, ipNets map[*net.IPNet]struct{}) bool\nfunc InInts(slice []int, n int) bool\nfunc InStrings(ss []string, s string) bool\nfunc InitCSTLocation() (name string, loc *time.Location, cst *time.Location, ok bool)\nfunc InitChinaLocation() *time.Location\nfunc InitLocation(name string) (*time.Location, bool)\nfunc Int2IPv6(ipInt *big.Int) net.IP\nfunc Int2IPv6String(n *big.Int) string\nfunc IsIP(ip string) bool\nfunc IsIPv4(s string) bool\nfunc IsIPv6(s string) bool\nfunc IsInternalIPv4(ip net.IP) bool\nfunc IsInternalIPv4String(ip string) bool\nfunc IsLeapYear(year int) bool\nfunc IsLetter(s string) bool\nfunc IsLetterOrNumeric(s string) bool\nfunc IsNumeric(s string) bool\nfunc IsPrivateIP(ip net.IP) bool\nfunc IsPrivateIPString(ip string) bool\nfunc JoinBytes(b ...[]byte) []byte\nfunc JoinString(s ...string) string\nfunc JoinStringBytes(s ...string) []byte\nfunc LastString(s, sep string, defaultStr ...string) string\nfunc LeftPad(s, pad string, n int) string\nfunc LeftPadBytes(b, pad []byte, n int) []byte\nfunc Logn(n, b float64) float64\nfunc Long2IPv4(n int) net.IP\nfunc Long2IPv4String(n int) string\nfunc LongLittle2IPv4(n int) net.IP\nfunc LongLittle2IPv4String(n int) string\nfunc MaxInt(a, b int) int\nfunc MinInt(a, b int) int\nfunc MustBool(v interface{}) bool\nfunc MustInt(v interface{}) int\nfunc MustJSON(v interface{}) []byte\nfunc MustJSONIndent(v interface{}) []byte\nfunc MustJSONIndentString(v interface{}) string\nfunc MustJSONString(v interface{}) string\nfunc MustParseHumanBigBytes(s string, defaultVal ...*big.Int) *big.Int\nfunc MustParseHumanBytes(s string, defaultVal ...uint64) uint64\nfunc MustString(v interface{}, timeLayout ...string) string\nfunc NanoTime() int64\nfunc NewRand(seed ...int64) *rand.Rand\nfunc NewSpinLock() sync.Locker\nfunc Pad(s, pad string, n int) string\nfunc PadBytes(s, pad []byte, n int) []byte\nfunc ParseHostPort(s string) (net.IP, uint16, bool, error)\nfunc ParseHumanBigBytes(s string) (*big.Int, error)\nfunc ParseHumanBytes(s string) (uint64, error)\nfunc ParseIP(s string) (net.IP, bool)\nfunc ParseIPv4(ip string) net.IP\nfunc ParseIPv6(ip string) net.IP\nfunc ParseIPx(s string) (net.IP, bool)\nfunc ParseIPxWithNumeric(s string) (net.IP, bool)\nfunc ParseInts(s string) ([]int, error)\nfunc RandAlphaBytes(n int) []byte\nfunc RandAlphaString(n int) string\nfunc RandBytes(n int) []byte\nfunc RandBytesLetters(n int, letters string) []byte\nfunc RandDecBytes(n int) []byte\nfunc RandDecString(n int) string\nfunc RandHexBytes(n int) []byte\nfunc RandHexString(n int) string\nfunc RandInt(min, max int) int\nfunc RandString(n int) string\nfunc RandUint32(min, max uint32) uint32\nfunc Recover(cb ...RecoveryCallback)\nfunc RemoveRunes(s string, toRemove string) string\nfunc RemoveString(ss []string, s string) ([]string, bool)\nfunc ReplaceHost(a, b string) string\nfunc Reverse(s string) string\nfunc RightPad(s, pad string, n int) string\nfunc RightPadBytes(b, pad []byte, n int) []byte\nfunc Round(v float64, precision int) float64\nfunc RunPath() string\nfunc RuneReverse(s string) string\nfunc RuneSubString(s string, length int, suffix string) string\nfunc S2B(s string) []byte\nfunc SafeGo(fn func(), cb ...RecoveryCallback)\nfunc SafeGoCommonFunc(args interface{}, fn func(args interface{}), cb ...RecoveryCallback)\nfunc SafeGoWithContext(ctx context.Context, fn func(ctx context.Context), cb ...RecoveryCallback)\nfunc SearchInt(slice []int, n int) int\nfunc SearchString(ss []string, s string) int\nfunc Sleep(ctx context.Context, interval time.Duration) error\nfunc SplitHostPort(hostPort string) (host, port string)\nfunc SumInt(v ...int) int\nfunc ToLower(b string) string\nfunc ToLowerBytes(b []byte) []byte\nfunc ToUpper(b string) string\nfunc ToUpperBytes(b []byte) []byte\nfunc Trim(s string, cutset byte) string\nfunc TrimBytes(b []byte, cutset byte) []byte\nfunc TrimLeft(s string, cutset byte) string\nfunc TrimLeftBytes(b []byte, cutset byte) []byte\nfunc TrimRight(s string, cutset byte) string\nfunc TrimRightBytes(b []byte, cutset byte) []byte\nfunc TrimSlice(ss []string) []string\nfunc TruncStr(s string, maxLen int, suffix string) string\nfunc UUID() []byte\nfunc UUIDShort() string\nfunc UUIDSimple() string\nfunc UUIDString() string\nfunc Ungzip(data []byte) (src []byte, err error)\nfunc Unzip(data []byte) (src []byte, err error)\nfunc ValidOptionalPort(port string) bool\nfunc WaitNextMinute(t ...time.Time)\nfunc WaitNextMinuteWithTime(t ...time.Time) (now time.Time)\nfunc WaitNextSecond(t ...time.Time)\nfunc WaitNextSecondWithTime(t ...time.Time) (now time.Time)\nfunc WaitSignal(sig ...os.Signal) os.Signal\nfunc WaitUntilMinute(m int, t ...time.Time)\nfunc WaitUntilSecond(s int, t ...time.Time)\nfunc Zip(data []byte) ([]byte, error)\nfunc ZipLevel(data []byte, level int) (dst []byte, err error)\ntype Bool struct{ ... }\n    func NewBool(val bool) *Bool\n    func NewFalse() *Bool\n    func NewTrue() *Bool\ntype NoCmp [0]func()\ntype NoCopy struct{}\ntype RecoveryCallback func(err interface{}, trace []byte)\ntype TryMutex struct{ ... }\n    func NewTryMutex() *TryMutex\n```\n\u003c/details\u003e\n\n### 泛型方法集\n\n具体使用见各目录下的文档或测试\n\n- [`xslices`](generic/xslices) slices 扩展助手函数.\n- [`deepcopy`](generic/deepcopy) DeepCopy makes deep copies of things: unexported field values are not copied.. [@smallnest](https://github.com/smallnest)\n- [`atox`](generic/atox): a generic wrapper for the Parse* functions in the strconv package. [@josharian](https://github.com/josharian)\n- 更多泛型方法可参考: [zyedidia/generic](https://github.com/zyedidia/generic)\n\n### 有序字典\n\n见: [orderedmap](orderedmap) ([@iancoleman](https://github.com/iancoleman/orderedmap))\n\nA golang data type equivalent to python's collections.OrderedDict\n\n支持 JSON 序列化, 键/值排序.\n\n### 数据类型转换函数集\n\n见: [conv](conv) ([@tidwall](https://github.com/tidwall/conv))\n\n\u003cdetails\u003e\n  \u003csummary\u003eDOC\u003c/summary\u003e\n\n```go\npackage conv // import \"github.com/fufuok/utils/conv\"\n\nfunc Atof(a string) float64\nfunc Atoi(a string) int64\nfunc Atot(a string) bool\nfunc Atou(a string) uint64\nfunc Atov(a string) interface{}\nfunc Ftoa(f float64) string\nfunc Ftoi(f float64) int64\nfunc Ftot(f float64) bool\nfunc Ftou(f float64) uint64\nfunc Ftov(f float64) interface{}\nfunc Itoa(i int64) string\nfunc Itof(i int64) float64\nfunc Itot(i int64) bool\nfunc Itou(i int64) uint64\nfunc Itov(i int64) interface{}\nfunc Ttoa(t bool) string\nfunc Ttof(t bool) float64\nfunc Ttoi(t bool) int64\nfunc Ttou(t bool) uint64\nfunc Ttov(t bool) interface{}\nfunc Utoa(u uint64) string\nfunc Utof(u uint64) float64\nfunc Utoi(u uint64) int64\nfunc Utot(u uint64) bool\nfunc Utov(u uint64) interface{}\nfunc Vtoa(v interface{}) string\nfunc Vtof(v interface{}) float64\nfunc Vtoi(v interface{}) int64\nfunc Vtot(v interface{}) bool\nfunc Vtou(v interface{}) uint64\n```\n\u003c/details\u003e\n\n### 加解密小工具\n\n见: [envtools](envtools)\n\n### 常用对称加解密函数\n\n见: [xcrypto](xcrypto)\n\n\u003cdetails\u003e\n  \u003csummary\u003eDOC\u003c/summary\u003e\n\n```go\npackage xcrypto // import \"github.com/fufuok/utils/xcrypto\"\n\nfunc AesCBCDeB58(s string, key []byte) []byte\nfunc AesCBCDeB64(s string, key []byte) []byte\nfunc AesCBCDeHex(s string, key []byte) []byte\nfunc AesCBCDePKCS7B58(s string, key []byte) []byte\nfunc AesCBCDePKCS7B64(s string, key []byte) []byte\nfunc AesCBCDePKCS7Hex(s string, key []byte) []byte\nfunc AesCBCDePKCS7StringB58(s string, key []byte) string\nfunc AesCBCDePKCS7StringB64(s string, key []byte) string\nfunc AesCBCDePKCS7StringHex(s string, key []byte) string\nfunc AesCBCDeStringB58(s string, key []byte) string\nfunc AesCBCDeStringB64(s string, key []byte) string\nfunc AesCBCDeStringHex(s string, key []byte) string\nfunc AesCBCDecrypt(asPKCS7 bool, ciphertext, key []byte, ivs ...[]byte) (plaintext []byte)\nfunc AesCBCDecryptE(asPKCS7 bool, ciphertext, key []byte, ivs ...[]byte) ([]byte, error)\nfunc AesCBCEnB58(b, key []byte) string\nfunc AesCBCEnB64(b, key []byte) string\nfunc AesCBCEnHex(b, key []byte) string\nfunc AesCBCEnPKCS7B58(b, key []byte) string\nfunc AesCBCEnPKCS7B64(b, key []byte) string\nfunc AesCBCEnPKCS7Hex(b, key []byte) string\nfunc AesCBCEnPKCS7StringB58(s string, key []byte) string\nfunc AesCBCEnPKCS7StringB64(s string, key []byte) string\nfunc AesCBCEnPKCS7StringHex(s string, key []byte) string\nfunc AesCBCEnStringB58(s string, key []byte) string\nfunc AesCBCEnStringB64(s string, key []byte) string\nfunc AesCBCEnStringHex(s string, key []byte) string\nfunc AesCBCEncrypt(asPKCS7 bool, plaintext, key []byte, ivs ...[]byte) (ciphertext []byte)\nfunc AesCBCEncryptE(asPKCS7 bool, plaintext, key []byte, ivs ...[]byte) ([]byte, error)\nfunc AesGCMDeB58(s string, key, nonce []byte) []byte\nfunc AesGCMDeB64(s string, key, nonce []byte) []byte\nfunc AesGCMDeHex(s string, key, nonce []byte) []byte\nfunc AesGCMDeStringB58(s string, key, nonce []byte) string\nfunc AesGCMDeStringB64(s string, key, nonce []byte) string\nfunc AesGCMDeStringHex(s string, key, nonce []byte) string\nfunc AesGCMDecrypt(ciphertext, key, nonce []byte) (plaintext []byte)\nfunc AesGCMDecryptWithNonce(ciphertext, key, nonce, additionalData []byte) ([]byte, error)\nfunc AesGCMEnB58(b, key []byte) (string, []byte)\nfunc AesGCMEnB64(b, key []byte) (string, []byte)\nfunc AesGCMEnHex(b, key []byte) (string, []byte)\nfunc AesGCMEnStringB58(s string, key []byte) (string, []byte)\nfunc AesGCMEnStringB64(s string, key []byte) (string, []byte)\nfunc AesGCMEnStringHex(s string, key []byte) (string, []byte)\nfunc AesGCMEncrypt(plaintext, key []byte) (ciphertext []byte, nonce []byte)\nfunc AesGCMEncryptWithNonce(plaintext, key, nonce, additionalData []byte) ([]byte, []byte, error)\nfunc Decrypt(value, secret string) string\nfunc DesCBCDeB58(s string, key []byte) []byte\nfunc DesCBCDeB64(s string, key []byte) []byte\nfunc DesCBCDeHex(s string, key []byte) []byte\nfunc DesCBCDePKCS7B58(s string, key []byte) []byte\nfunc DesCBCDePKCS7B64(s string, key []byte) []byte\nfunc DesCBCDePKCS7Hex(s string, key []byte) []byte\nfunc DesCBCDePKCS7StringB58(s string, key []byte) string\nfunc DesCBCDePKCS7StringB64(s string, key []byte) string\nfunc DesCBCDePKCS7StringHex(s string, key []byte) string\nfunc DesCBCDeStringB58(s string, key []byte) string\nfunc DesCBCDeStringB64(s string, key []byte) string\nfunc DesCBCDeStringHex(s string, key []byte) string\nfunc DesCBCDecrypt(asPKCS7 bool, ciphertext, key []byte, ivs ...[]byte) (plaintext []byte)\nfunc DesCBCDecryptE(asPKCS7 bool, ciphertext, key []byte, ivs ...[]byte) ([]byte, error)\nfunc DesCBCEnB58(b, key []byte) string\nfunc DesCBCEnB64(b, key []byte) string\nfunc DesCBCEnHex(b, key []byte) string\nfunc DesCBCEnPKCS7B58(b, key []byte) string\nfunc DesCBCEnPKCS7B64(b, key []byte) string\nfunc DesCBCEnPKCS7Hex(b, key []byte) string\nfunc DesCBCEnPKCS7StringB58(s string, key []byte) string\nfunc DesCBCEnPKCS7StringB64(s string, key []byte) string\nfunc DesCBCEnPKCS7StringHex(s string, key []byte) string\nfunc DesCBCEnStringB58(s string, key []byte) string\nfunc DesCBCEnStringB64(s string, key []byte) string\nfunc DesCBCEnStringHex(s string, key []byte) string\nfunc DesCBCEncrypt(asPKCS7 bool, plaintext, key []byte, ivs ...[]byte) (ciphertext []byte)\nfunc DesCBCEncryptE(asPKCS7 bool, plaintext, key []byte, ivs ...[]byte) ([]byte, error)\nfunc Encrypt(value, secret string) string\nfunc GCMDeB58(s string, key []byte) []byte\nfunc GCMDeB64(s string, key []byte) []byte\nfunc GCMDeHex(s string, key []byte) []byte\nfunc GCMDeStringB58(s string, key []byte) string\nfunc GCMDeStringB64(s string, key []byte) string\nfunc GCMDeStringHex(s string, key []byte) string\nfunc GCMDecrypt(encrypted, key []byte) ([]byte, error)\nfunc GCMEnB58(b, key []byte) string\nfunc GCMEnB64(b, key []byte) string\nfunc GCMEnHex(b, key []byte) string\nfunc GCMEnStringB58(s string, key []byte) string\nfunc GCMEnStringB64(s string, key []byte) string\nfunc GCMEnStringHex(s string, key []byte) string\nfunc GCMEncrypt(plaintext, key []byte) ([]byte, error)\nfunc GenRSAKey(bits int) (publicKey, privateKey []byte)\nfunc GetenvDecrypt(key string, secret string) string\nfunc Padding(b []byte, bSize int, pkcs7 bool) []byte\nfunc ParsePrivateKey(privateKey []byte) (priv *rsa.PrivateKey, err error)\nfunc ParsePublicKey(publicKey []byte) (pub *rsa.PublicKey, err error)\nfunc RSADecrypt(ciphertext, privateKey []byte) ([]byte, error)\nfunc RSAEncrypt(plaintext, publicKey []byte) ([]byte, error)\nfunc RSASign(data, privateKey []byte) ([]byte, error)\nfunc RSASignVerify(data, publicKey, sig []byte) error\nfunc SetenvEncrypt(key, value, secret string) (string, error)\nfunc UnPadding(b []byte, pkcs7 bool) []byte\nfunc XOR(src, key []byte) []byte\nfunc XORDeB58(s string, key []byte) []byte\nfunc XORDeB64(s string, key []byte) []byte\nfunc XORDeHex(s string, key []byte) []byte\nfunc XORDeStringB58(s string, key []byte) string\nfunc XORDeStringB64(s string, key []byte) string\nfunc XORDeStringHex(s string, key []byte) string\nfunc XORE(src, key []byte) ([]byte, error)\nfunc XOREnB58(b, key []byte) string\nfunc XOREnB64(b, key []byte) string\nfunc XOREnHex(b, key []byte) string\nfunc XOREnStringB58(s string, key []byte) string\nfunc XOREnStringB64(s string, key []byte) string\nfunc XOREnStringHex(s string, key []byte) string\n```\n\u003c/details\u003e\n\n### 获取内外网 IP 小工具\n\n见: [myip](myip)\n\n或: https://github.com/fufuok/myip\n\n\u003cdetails\u003e\n  \u003csummary\u003eDOC\u003c/summary\u003e\n\n```go\npackage myip // import \"github.com/fufuok/utils/myip\"\n\nfunc ExternalIP(v ...string) string\nfunc ExternalIPAny(retries ...int) string\nfunc ExternalIPv4() string\nfunc ExternalIPv6() string\nfunc InterfaceAddrs(v ...string) (map[string][]net.IP, error)\nfunc InternalIP(dstAddr, network string) string\nfunc InternalIPAny() string\nfunc InternalIPv4() string\nfunc InternalIPv6() string\nfunc LocalIP(exclude ...string) string\nfunc LocalIPv4s() (ips []string)\n```\n\u003c/details\u003e\n\n### 编码解码 base62\n\n见: [base62](base62) ([@jxskiss](https://github.com/jxskiss/base62))\n\n或: https://github.com/fufuok/basex\n\n\u003cdetails\u003e\n  \u003csummary\u003eDOC\u003c/summary\u003e\n\n```go\npackage base62 // import \"github.com/fufuok/utils/base62\"\n\nvar StdEncoding = NewEncoding(encodeStd)\nfunc AppendInt(dst []byte, num int64) []byte\nfunc AppendUint(dst []byte, num uint64) []byte\nfunc Decode(src []byte) ([]byte, error)\nfunc DecodeString(src string) ([]byte, error)\nfunc DecodeToBuf(dst []byte, src []byte) ([]byte, error)\nfunc Encode(src []byte) []byte\nfunc EncodeToBuf(dst []byte, src []byte) []byte\nfunc EncodeToString(src []byte) string\nfunc FormatInt(num int64) []byte\nfunc FormatUint(num uint64) []byte\nfunc ParseInt(src []byte) (int64, error)\nfunc ParseUint(src []byte) (uint64, error)\ntype CorruptInputError int64\ntype Encoding struct{ ... }\n    func NewEncoding(encoder string) *Encoding\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eUsage\u003c/summary\u003e\n\n```go\n// Basic usage.\nEncode(src []byte) []byte\nEncodeToString(src []byte) string\nDecode(src []byte) ([]byte, error)\nDecodeString(src string) ([]byte, error)\nFormatInt(num int64) []byte\nFormatUint(num uint64) []byte\nParseInt(src []byte) (int64, error)\nParseUint(src []byte) (uint64, error)\n\n// Providing a dst buffer, you may reuse buffers to reduce memory allocation.\nEncodeToBuf(dst []byte, src []byte) []byte\nDecodeToBuf(dst []byte, src []byte) ([]byte, error)\nAppendInt(dst []byte, num int64) []byte\nAppendUint(dst []byte, num uint64) []byte\n\n// Or you may use a custom encoding alphabet.\nenc := NewEncoding(\"...my-62-byte-string-alphabet...\")\nenc.XXX()\n```\n\u003c/details\u003e\n\n### 编码解码 base58\n\n见: [base58](base58)\n\n或: https://github.com/fufuok/basex\n\n\u003cdetails\u003e\n  \u003csummary\u003eDOC\u003c/summary\u003e\n\n```go\npackage base58 // import \"github.com/fufuok/utils/base58\"\n\nfunc CheckDecode(input string) (result []byte, version byte, err error)\nfunc CheckEncode(input []byte, version byte) string\nfunc Decode(b string) []byte\nfunc Encode(b []byte) string\n```\n\u003c/details\u003e\n\n### 高性能 Hash 方法及生成器\n\n见: [xhash](xhash)\n\n\u003cdetails\u003e\n  \u003csummary\u003eDOC\u003c/summary\u003e\n\n```go\npackage xhash // import \"github.com/fufuok/utils/xhash\"\n\nfunc AddBytes32(h uint32, b []byte) uint32\nfunc AddBytes64(h uint64, b []byte) uint64\nfunc AddString32(h uint32, s string) uint32\nfunc AddString64(h uint64, s string) uint64\nfunc AddUint32(h, u uint32) uint32\nfunc AddUint64(h uint64, u uint64) uint64\nfunc Djb33(s string) uint32\nfunc FastModulo(x, n uint32) uint32\nfunc FnvHash(s string) uint64\nfunc FnvHash32(s string) uint32\nfunc GenHasher[K comparable]() func(K) uintptr\nfunc GenHasher64[K comparable]() func(K) uint64\nfunc GenSeedHasher64[K comparable]() func(maphash.Seed, K) uint64\nfunc Hash(b []byte, h hash.Hash) []byte\nfunc HashBytes(b ...[]byte) string\nfunc HashBytes32(b ...[]byte) uint32\nfunc HashBytes64(b ...[]byte) uint64\nfunc HashSeedString(seed maphash.Seed, s string) uint64\nfunc HashSeedUint64(seed maphash.Seed, n uint64) uint64\nfunc HashString(s ...string) string\nfunc HashString32(s ...string) uint32\nfunc HashString64(s ...string) uint64\nfunc HashUint32(u uint32) uint32\nfunc HashUint64(u uint64) uint64\nfunc Hmac(b []byte, key []byte, h func() hash.Hash) []byte\nfunc HmacSHA1(b, key []byte) []byte\nfunc HmacSHA1Hex(s, key string) string\nfunc HmacSHA256(b, key []byte) []byte\nfunc HmacSHA256Hex(s, key string) string\nfunc HmacSHA512(b, key []byte) []byte\nfunc HmacSHA512Hex(s, key string) string\nfunc MD5(b []byte) []byte\nfunc MD5BytesHex(bs []byte) string\nfunc MD5Hex(s string) string\nfunc MD5Reader(r io.Reader) (string, error)\nfunc MD5Sum(filename string) (string, error)\nfunc MakeHasher[T comparable]() func(T) uint64\nfunc MakeSeed() uint64\nfunc MemHash(s string) uint64\nfunc MemHash32(s string) uint32\nfunc MemHashb(b []byte) uint64\nfunc MemHashb32(b []byte) uint32\nfunc MustMD5Sum(filename string) string\nfunc Sha1(b []byte) []byte\nfunc Sha1Hex(s string) string\nfunc Sha256(b []byte) []byte\nfunc Sha256Hex(s string) string\nfunc Sha512(b []byte) []byte\nfunc Sha512Hex(s string) string\nfunc Sum32(s string) uint32\nfunc Sum64(s string) uint64\nfunc SumBytes32(bs []byte) uint32\nfunc SumBytes64(bs []byte) uint64\ntype Hashable interface{ ... }\n```\n\u003c/details\u003e\n\n### 可排序全局唯一 ID 生成器\n\n比 UUID 更快, 更短\n\n- 要使用 UUIDv4 可以使用 `utils.UUID()`\n\n- 要使用程序运行时自增 ID 可以使用 `utils.ID()`\n\n见: [xid](xid) ([@rs](https://github.com/rs/xid))\n\n或: http://github.com/fufuok/xid\n\n\u003cdetails\u003e\n  \u003csummary\u003eDOC\u003c/summary\u003e\n\n```go\npackage xid // import \"github.com/fufuok/utils/xid\"\n\nfunc NewBytes() []byte\nfunc NewString() string\nfunc Sort(ids []ID)\ntype ID [rawLen]byte\n    func FromBytes(b []byte) (ID, error)\n    func FromString(id string) (ID, error)\n    func New() ID\n    func NewWithTime(t time.Time) ID\n    func NilID() ID\n```\n\u003c/details\u003e\n\n### 自守护进程和后台运行\n\n见: [xdaemon](xdaemon) ([@zh-five](https://github.com/zh-five/xdaemon))\n\n或: https://github.com/fufuok/xdaemon\n\n\u003cdetails\u003e\n  \u003csummary\u003eDOC\u003c/summary\u003e\n\n```go\npackage xdaemon // import \"github.com/fufuok/utils/xdaemon\"\n\nconst EnvName = \"XW_DAEMON_IDX\"\nfunc Background(logFile string, isExit bool) (*exec.Cmd, error)\nfunc NewSysProcAttr() *syscall.SysProcAttr\ntype Daemon struct{ ... }\n    func NewDaemon(logFile string) *Daemon\n```\n\u003c/details\u003e\n\n### 高性能并发安全同步扩展库\n\n见: [xsync](xsync) ([@puzpuzpuz](https://github.com/puzpuzpuz/xsync))\n\n或: https://github.com/fufuok/xsync\n\n**官方版本: `v3.0.0` 已统一了调用方法并内置了 hasher 生成器, 不再需要之前的改动, 直接使用官方原版就好**\n\n\u003cdetails\u003e\n  \u003csummary\u003eDOC\u003c/summary\u003e\n\n```go\npackage xsync // import \"github.com/fufuok/utils/xsync\"\n\nfunc ToPlainMap(m *Map) map[string]interface{}\nfunc ToPlainMapOf[K comparable, V any](m *MapOf[K, V]) map[K]V\nfunc WithGrowOnly() func(*MapConfig)\nfunc WithPresize(sizeHint int) func(*MapConfig)\ntype Counter struct{ ... }\n    func NewCounter() *Counter\ntype HashMapOf[K comparable, V any] interface{ ... }\ntype MPMCQueue struct{ ... }\n    func NewMPMCQueue(capacity int) *MPMCQueue\ntype MPMCQueueOf[I any] struct{ ... }\n    func NewMPMCQueueOf[I any](capacity int) *MPMCQueueOf[I]\ntype Map struct{ ... }\n    func NewMap(options ...func(*MapConfig)) *Map\n    func NewMapPresized(sizeHint int) *Map\ntype MapConfig struct{ ... }\ntype MapOf[K comparable, V any] struct{ ... }\n    func NewMapOf[K comparable, V any](options ...func(*MapConfig)) *MapOf[K, V]\n    func NewMapOfPresized[K comparable, V any](sizeHint int) *MapOf[K, V]\n    func NewMapOfWithHasher[K comparable, V any](hasher func(K, uint64) uint64, options ...func(*MapConfig)) *MapOf[K, V]\ntype MapStats struct{ ... }\ntype RBMutex struct{ ... }\n    func NewRBMutex() *RBMutex\ntype RToken struct{ ... }\ntype SPSCQueue struct{ ... }\n    func NewSPSCQueue(capacity int) *SPSCQueue\ntype SPSCQueueOf[I any] struct{ ... }\n    func NewSPSCQueueOf[I any](capacity int) *SPSCQueueOf[I]\n```\n\u003c/details\u003e\n\n### 高效的 JSON 字符串操作库集\n\n1. **只有 `1` 次内存分配的 JSON 字符串生成器**\n\n见: [jsongen](xjson/jsongen) ([@darjun](https://github.com/darjun/json-gen))\n\n或: [https://github.com/fufuok/jsongen](https://github.com/fufuok/jsongen)\n\n\u003cdetails\u003e\n  \u003csummary\u003eDOC\u003c/summary\u003e\n\n```go\npackage jsongen // import \"github.com/fufuok/utils/xjson/jsongen\"\n\nPackage jsongen forked from darjun/json-gen\n\nPackage jsongen Copyright 2024 Joshua J Baker. All rights reserved. Use of this\nsource code is governed by an MIT-style license that can be found in the LICENSE\nfile.\n\nhttps://github.com/tidwall/gjson\n\nvar DisableEscapeHTML = false\nfunc AppendJSONString(dst []byte, s string) []byte\nfunc EscapeString(s string) string\ntype Array struct{ ... }\n    func NewArray() *Array\ntype Map struct{ ... }\n    func NewMap() *Map\ntype RawBytes []byte\ntype RawString string\ntype V string\ntype Value interface{ ... }\n```\n\u003c/details\u003e\n\n2. **超高效的 JSON 字符串解析和字段搜索**\n\n见: [gjson](xjson/gjson) ([@tidwall](https://github.com/tidwall/gjson))\n\n\u003cdetails\u003e\n  \u003csummary\u003eDOC\u003c/summary\u003e\n\n```go\npackage gjson // import \"github.com/fufuok/utils/xjson/gjson\"\n\nPackage gjson provides searching for json strings.\n\nvar DisableEscapeHTML = false\nvar DisableModifiers = false\nfunc AddModifier(name string, fn func(json, arg string) string)\nfunc AppendJSONString(dst []byte, s string) []byte\nfunc Escape(comp string) string\nfunc ForEachLine(json string, iterator func(line Result) bool)\nfunc ModifierExists(name string, fn func(json, arg string) string) bool\nfunc Valid(json string) bool\nfunc ValidBytes(json []byte) bool\ntype Result struct{ ... }\n    func Get(json, path string) Result\n    func GetBytes(json []byte, path string) Result\n    func GetMany(json string, path ...string) []Result\n    func GetManyBytes(json []byte, path ...string) []Result\n    func Parse(json string) Result\n    func ParseBytes(json []byte) Result\ntype Type int\n    const Null Type = iota ...\n```\n\u003c/details\u003e\n\n3. **JSON 字符串字段修改和删除**\n\n见: [sjson](xjson/sjson) ([@tidwall](https://github.com/tidwall/sjson))\n\n\u003cdetails\u003e\n  \u003csummary\u003eDOC\u003c/summary\u003e\n\n```go\npackage sjson // import \"github.com/fufuok/utils/xjson/sjson\"\n\nPackage sjson provides setting json values.\n\nfunc Delete(json, path string) (string, error)\nfunc DeleteBytes(json []byte, path string) ([]byte, error)\nfunc Set(json, path string, value interface{}) (string, error)\nfunc SetBytes(json []byte, path string, value interface{}) ([]byte, error)\nfunc SetBytesOptions(json []byte, path string, value interface{}, opts *Options) ([]byte, error)\nfunc SetOptions(json, path string, value interface{}, opts *Options) (string, error)\nfunc SetRaw(json, path, value string) (string, error)\nfunc SetRawBytes(json []byte, path string, value []byte) ([]byte, error)\nfunc SetRawBytesOptions(json []byte, path string, value []byte, opts *Options) ([]byte, error)\nfunc SetRawOptions(json, path, value string, opts *Options) (string, error)\ntype Options struct{ ... }\n```\n\u003c/details\u003e\n\n4. **JSON 字符串格式化和校验**\n\n见: [pretty](xjson/pretty) ([@tidwall](https://github.com/tidwall/pretty))\n\n\u003cdetails\u003e\n  \u003csummary\u003eDOC\u003c/summary\u003e\n\n```go\npackage pretty // import \"github.com/fufuok/utils/xjson/pretty\"\n\nvar DefaultOptions = \u0026Options{ ... }\nfunc Color(src []byte, style *Style) []byte\nfunc Pretty(json []byte) []byte\nfunc PrettyOptions(json []byte, opts *Options) []byte\nfunc Spec(src []byte) []byte\nfunc SpecInPlace(src []byte) []byte\nfunc Ugly(json []byte) []byte\nfunc UglyInPlace(json []byte) []byte\ntype Options struct{ ... }\ntype Style struct{ ... }\n    var TerminalStyle *Style\n```\n\u003c/details\u003e\n\n5. 字符串模式匹配(`*?`通配符搜索)\n\n见: [match](xjson/match) ([@tidwall](https://github.com/tidwall/match))\n\n\u003cdetails\u003e\n  \u003csummary\u003eDOC\u003c/summary\u003e\n\n```go\npackage match // import \"github.com/fufuok/utils/xjson/match\"\n\nPackage match provides a simple pattern matcher with unicode support.\n\nfunc Allowable(pattern string) (min, max string)\nfunc IsPattern(str string) bool\nfunc Match(str, pattern string) bool\nfunc MatchLimit(str, pattern string, maxcomp int) (matched, stopped bool)\n```\n\u003c/details\u003e\n\n### 常用的池\n\n`[]byte` 更多功能的字节切片池化见: [github.com/fufuok/bytespool](https://github.com/fufuok/bytespool)\n\n见: [pools](pools)\n\n\u003cdetails\u003e\n  \u003csummary\u003eDOC\u003c/summary\u003e\n\n```go\npackage bytespool // import \"github.com/fufuok/utils/pools/bytespool\"\n\nfunc Append(buf []byte, elems ...byte) []byte\nfunc AppendString(buf []byte, elems string) []byte\nfunc Get(size int) []byte\nfunc Make(size int) []byte\nfunc New(size int) []byte\nfunc Put(buf []byte)\nfunc Release(buf []byte) bool\nfunc SetMaxSize(size int) bool\ntype CapacityPools struct{ ... }\n\npackage bufferpool // import \"github.com/fufuok/utils/pools/bufferpool\"\n\nfunc Get() *bytes.Buffer\nfunc New(bs []byte) *bytes.Buffer\nfunc NewByte(c byte) *bytes.Buffer\nfunc NewRune(r rune) *bytes.Buffer\nfunc NewString(s string) *bytes.Buffer\nfunc Put(buf *bytes.Buffer)\nfunc Release(buf *bytes.Buffer) bool\nfunc SetMaxSize(size int) bool\n\npackage readerpool // import \"github.com/fufuok/utils/pools/readerpool\"\n\nfunc New(b []byte) *bytes.Reader\nfunc Release(r *bytes.Reader)\n\npackage timerpool // import \"github.com/fufuok/utils/pools/timerpool\"\n\nfunc New(d time.Duration) *time.Timer\nfunc Release(t *time.Timer)\n\npackage tickerpool // import \"github.com/fufuok/utils/pools/tickerpool\"\n\nfunc New(d time.Duration) *time.Ticker\nfunc Release(t *time.Ticker)\n```\n\u003c/details\u003e\n\n### 并发任务调度库\n\n见: [sched](sched)\n\n或: https://github.com/fufuok/sched\n\n简洁, 高效, 并发限制, 复用 goroutine\n\n\u003cdetails\u003e\n  \u003csummary\u003eDOC\u003c/summary\u003e\n\n```go\npackage sched // import \"github.com/fufuok/utils/sched\"\n\ntype Option func(w *Pool)\n    func Queues(limit int) Option\n    func Workers(limit int) Option\ntype Pool struct{ ... }\n    func New(opts ...Option) *Pool\n```\n\u003c/details\u003e\n\n### NTP 简单时间同步\n\n独立项目, 见: https://github.com/fufuok/ntp\n\n默认优选 NTP Host, 周期性返回时钟偏移值或当前时间, 也可指定 Host 单次请求\n\n### 简单的日志文件滚动\n\n示例: [xfile/examples](xfile/examples)\n\n带文件写入 Buffer 的日志文件滚动器, 比如按日期滚动生成新文件\n\n\u003cdetails\u003e\n  \u003csummary\u003eDOC\u003c/summary\u003e\n\n```go\npackage xfile // import \"github.com/fufuok/utils/xfile\"\n\nconst DefaultFlushSizeLimit = 1 \u003c\u003c 20 ...\nvar ErrFilename = errors.New(\"wrong file name\")\nfunc CopyDir(srcDir, dstDir string) error\nfunc CopyFile(srcFile, dstFile string) error\nfunc HeadLines(filename string, num int) ([]string, error)\nfunc IsDir(s string) bool\nfunc IsExist(s string) bool\nfunc IsFile(s string) bool\nfunc ModTime(filename string) time.Time\nfunc ReadFile(filename string) (string, error)\nfunc ReadLines(filename string) ([]string, error)\nfunc ReadLinesOffsetN(filename string, offset uint, n int) ([]string, error)\nfunc ResetDir(dirPath string) error\nfunc TailLines(filename string, num int, cleanLine ...bool) ([]string, error)\nfunc UnzipDir(zipFile, dstDir string) error\nfunc UnzipFile(zipFile *zip.File, dstFile string) error\nfunc ZipDir(srcDir, zipFilePath string) error\ntype DefaultFilename struct{}\ntype FilenameMaker interface{ ... }\ntype Logger interface{ ... }\ntype Options struct{ ... }\ntype Roller struct{ ... }\n    func NewRoller(filename string, opt *Options) (*Roller, error)\ntype TimeBasedFilename struct{ ... }\n```\n\u003c/details\u003e\n\n## 使用示例\n\n```go\npackage main\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/fufuok/utils\"\n\t\"github.com/fufuok/utils/assert\"\n\t\"github.com/fufuok/utils/base58\"\n\t\"github.com/fufuok/utils/base62\"\n\t\"github.com/fufuok/utils/conv\"\n\t\"github.com/fufuok/utils/pools/bufferpool\"\n\t\"github.com/fufuok/utils/sched\"\n\t\"github.com/fufuok/utils/xcrypto\"\n\t\"github.com/fufuok/utils/xhash\"\n\t\"github.com/fufuok/utils/xid\"\n\t\"github.com/fufuok/utils/xjson/jsongen\"\n)\n\nfunc main() {\n\tvar s string\n\ts = utils.GetString(123.45)         // \"123.45\"\n\ts = utils.GetString(nil)            // \"\"\n\ts = utils.GetString(nil, \"default\") // \"default\"\n\ts = utils.GetString([]byte(\"ff\"))   // \"ff\"\n\ts = utils.GetString(true)           // \"true\"\n\n\ts = conv.Ftoa(123.45) // \"123.45\"\n\ts = conv.Vtoa(nil)    // \"\"\n\ts = conv.Ttoa(true)   // \"true\"\n\n\tx := utils.JoinString(s, \"OK\") // \"trueOK\"\n\n\tb := []byte(\"trueOK\")\n\ts = utils.B2S(b[0:1])                                     // \"t\"\n\tsafeS1 := utils.B2S([]byte(s[0:1]))                       // 转换为不可变字符串, CopyString 的实现\n\tsafeS2 := utils.CopyString(s[0:1])                        // 不可变字符串, s 可以被 GC 回收\n\tsafeS3 := utils.GetSafeString(s[0:1], \"optional default\") // 不可变字符串\n\tsafeS4 := utils.GetSafeB2S(b[0:1], \"optional default\")    // 转换为不可变字符串\n\tsafeS5 := string(b[0:1])                                  // 标准转换\n\tb[0] = 70                                                 // 注意: 底层数组变化会引起字符串 s 发生改变\n\tfmt.Println(s, safeS1, safeS2, safeS3, safeS4, safeS5)    // F t t t t t\n\n\tx = xcrypto.Encrypt(\"myData\", \"myKey\")\n\tfmt.Println(x) // Csi64LeQLmVhuZTh1xkCKM\n\tx = xcrypto.Decrypt(\"Csi64LeQLmVhuZTh1xkCKM\", \"myKey\")\n\tfmt.Println(x) // myData\n\n\tk := utils.RandBytes(16)\n\tx = xcrypto.AesCBCEnPKCS7StringHex(\"myData\", k)\n\tfmt.Println(x) // 9dce01c049de7493ce2fae6a2707fad1\n\tx = xcrypto.AesCBCEnStringB58(\"myData\", k)\n\tfmt.Println(x) // 6NHTJhaW5mfeUioFLrbpRX\n\n\tk = []byte(\"1234567812345678\")\n\tx = xcrypto.GCMEnStringHex(\"myData\", k)\n\tfmt.Println(x) // 6501bb4737c772b9a2956d87183d4793d44b0e3c233bf2c6435d70502913d5701a98\n\tx = xcrypto.GCMEnStringB58(\"myData\", k)\n\tfmt.Println(x) // 5H9ftJvyBesQS7yNGoW7sBCqpwedpEhkjB7k4Z8QBi8GYJo\n\n\tx = xcrypto.GCMEnStringB64(\"myData\", k)\n\tfmt.Println(xcrypto.GCMDeStringB64(x, k)) // myData\n\n\tx = utils.UUIDString()\n\tfmt.Println(x) // 04a49f17-8c37-44f7-a9c5-ea291c3736d7\n\tx = utils.UUIDSimple()\n\tfmt.Println(x) // 16123e98b35a4cea8e9cc127f379ff52\n\tx = utils.UUIDShort()\n\tfmt.Println(x) // Mw4hP7t9bnMMczU2AvyorU\n\tx = xid.NewString()\n\tfmt.Println(x) // c294bsnn5ek0ub0200fg\n\n\tx = base62.EncodeToString([]byte(\"Test data\"))\n\tfmt.Println(x) // hRXYkBCdzVGV\n\tbs, _ := base62.DecodeString(\"hRXYkBCdzVGV\")\n\tx = utils.B2S(bs)\n\tfmt.Println(x) // Test data\n\n\tx = base58.Encode([]byte(\"Test data\"))\n\tfmt.Println(x) // 25JnwSn7XKfNQ\n\tx = utils.B2S(base58.Decode(\"25JnwSn7XKfNQ\"))\n\tfmt.Println(x) // Test data\n\n\twhoami := utils.Executable(true)\n\tpwd := utils.ExecutableDir(true)\n\tfmt.Println(whoami, pwd)\n\n\tfmt.Println(utils.HumanBytes(1234567890))  // 1.2 GB\n\tfmt.Println(utils.HumanIBytes(1234567890)) // 1.1 GiB\n\tfmt.Println(utils.HumanKbps(1234567890))   // 1.2 Gbps\n\tfmt.Println(utils.Commaf(1234567890.123))  // 1,234,567,890.123\n\n\tnow := time.Date(2020, 2, 18, 12, 13, 14, 123456789, time.UTC)\n\tfmt.Println(utils.BeginOfLastWeek(now).Format(time.RFC3339Nano)) // 2020-02-10T00:00:00Z\n\n\tfmt.Println(utils.GetNotInternalIPv4String(\"100.125.1.1\", \"\", true))  // 100.125.1.1\n\tfmt.Println(utils.GetNotInternalIPv4String(\"100.125.1.1\", \"1.2.3.4\")) // 1.2.3.4\n\tfmt.Println(utils.GetNotInternalIPv4String(\"192.168.1.1\", \"1.2.3.4\")) // 1.2.3.4\n\tfmt.Println(utils.GetNotInternalIPv4String(\"119.118.7.6\", \"1.2.3.4\")) // 119.118.7.6\n\n\tvar nilN struct{}\n\tvar nilY *struct{}\n\tvar nilY2 *struct{}\n\tvar nilY3 = (*struct{})(nil)\n\tfmt.Println(assert.IsNil(nilN), assert.IsNil(nilY))                     // false true\n\tfmt.Println(assert.IsNil(nilY2), assert.IsNil(nilY3))                   // true true\n\tfmt.Println(assert.DeepEqual(nil, nilY), assert.DeepEqual(nilY2, nilY)) // false true\n\tfmt.Println(assert.DeepEqual(nilY3, nilY), nilY3 == nil)                // true true\n\tfmt.Println(nilY == nil, nilY == nilY2, nilY == nilY3)                  // true true true\n\tfmt.Println(assert.IsEmpty(nilN), assert.IsEmpty(nilY))                 // true true\n\n\tpublic, private := xcrypto.GenRSAKey(1024)\n\tfmt.Println(string(public))\n\tfmt.Println(string(private))\n\n\tfmt.Println(utils.IsPrivateIPString(\"FC00::\"))         // true\n\tfmt.Println(utils.IsPrivateIPString(\"172.17.0.0\"))     // true\n\tfmt.Println(utils.IsInternalIPv4String(\"100.125.1.1\")) // true\n\n\tfmt.Println(utils.ToLower(\"TesT\"))                                             // test\n\tfmt.Println(utils.EqualFold(utils.Trim(\"/TesT/\", '/'), utils.ToUpper(\"Test\"))) // true\n\n\thost, port := utils.SplitHostPort(\"demo.com:77\")\n\tfmt.Println(host) // demo.com\n\tfmt.Println(port) // 77\n\n\tfmt.Println(utils.Rand.Intn(10), utils.FastIntn(10))\n\n\tdec, _ := utils.Zip(utils.RandBytes(3000))\n\tsrc, _ := utils.Unzip(dec)\n\tfmt.Println(len(dec), len(src)) // 2288 3000\n\n\ttype T struct {\n\t\tName string `json:\"name\"`\n\t}\n\tt1 := T{\"ff\"}\n\tbuf := bufferpool.Get()\n\t_ = json.NewEncoder(buf).Encode(\u0026t1)\n\tfmt.Println(\"json:\", buf.String()) // json: {\"name\":\"ff\"}\n\tbufferpool.Put(buf)\n\n\tvar t2 T\n\tbuf = bufferpool.Get()\n\tbuf.WriteString(`{\"name\":\"ff\"}`)\n\t_ = json.NewDecoder(buf).Decode(\u0026t2)\n\tfmt.Printf(\"struct: %+v\\n\", t2)       // struct: {Name:ff}\n\tfmt.Println(\"empty:\", buf.Len() == 0) // empty: true\n\tbufferpool.Put(buf)\n\n\tjs := jsongen.NewMap()\n\tjs.PutString(\"s\", `a\"b\"\\c`)\n\tjs.PutFloat(\"f\", 3.14)\n\tjs.PutBool(\"b\", false)\n\tjsArr := jsongen.NewArray()\n\tjsArr.AppendInt(7)\n\tjsArr.AppendStringArray([]string{\"A\", \"B\"})\n\tjs.PutArray(\"sub\", jsArr)\n\tjsBytes := js.Serialize(nil)\n\tfmt.Printf(\"%s\\n\", jsBytes) // {\"s\":\"a\\\"b\\\"\\\\c\",\"f\":3.14,\"b\":false,\"sub\":[7,[\"A\",\"B\"]]}\n\n\tfmt.Println(utils.ID(), utils.ID()) // 1, 2\n\n\tfmt.Println(utils.CutString(\"test@fufuok.com\", \"@\")) // test fufuok.com true\n\n\tfmt.Println(xhash.Sum64(\"test\"))  // 18007334074686647077\n\tfmt.Println(xhash.MD5Hex(\"test\")) // 098f6bcd4621d373cade4e832627b4f6\n\n\tlock := utils.NewTryMutex()\n\tlock.Lock()\n\tok := lock.TryLock(20 * time.Millisecond)\n\tfmt.Println(ok) // false\n\tlock.Unlock()\n\tok = lock.TryLock(20 * time.Millisecond)\n\tfmt.Println(ok) // true\n\tlock.Unlock()\n\n\t// 等待下一秒 0 毫秒 (近似)\n\tnow = utils.WaitNextSecondWithTime()\n\tfmt.Println(\"hour:minute:second.00*ms\", now)\n\n\tcount := int64(0)\n\tbus := sched.New() // 默认并发数: runtime.NumCPU()\n\tfor i := 0; i \u003c 30; i++ {\n\t\tbus.Add(1)\n\t\tbus.RunWithArgs(func(n ...interface{}) {\n\t\t\tatomic.AddInt64(\u0026count, int64(n[0].(int)))\n\t\t}, i)\n\t}\n\tbus.Wait()\n\tfmt.Println(\"count:\", atomic.LoadInt64(\u0026count)) // count: 435\n\n\t// 继续下一批任务\n\tbus.Add(1)\n\tbus.Run(func() {\n\t\tfmt.Println(\"is running:\", bus.IsRunning(), bus.Running()) // is running: true 1\n\t})\n\tbus.Wait()\n\tbus.Release()\n\n\t// 指定并发数\n\tbus = sched.New(sched.Workers(2))\n\tbus.Add(5)\n\tfor i := 0; i \u003c 5; i++ {\n\t\tbus.Run(func() {\n\t\t\tfmt.Println(time.Now())\n\t\t\ttime.Sleep(time.Second)\n\t\t})\n\t}\n\tbus.WaitAndRelease()\n\tfmt.Println(\"is running:\", bus.IsRunning()) // is running: false\n\n\t// 原子操作的安全布尔值 (与 go1.19 一致)\n\tvar atomicBool utils.Bool\n\tatomicBool.StoreTrue()\n\tfmt.Println(\"is running:\", atomicBool.Load()) // is running: true\n\tatomicBool.Toggle()\n\tfmt.Println(\"is running:\", atomicBool.String()) // is running: false\n\n\twoo := func() {\n\t\tpanic(\"woo...\")\n\t}\n\tutils.SafeGo(woo)\n\tutils.SafeGo(woo, func(err interface{}, trace []byte) {\n\t\tfmt.Printf(\"SafeGo, ERR: %v, Traceback: \\n%s\\n\", err, trace)\n\t})\n\tfmt.Println(\"Ctrl+c to exit\")\n\tutils.WaitSignal()\n\tfmt.Println(\"Exited.\")\n}\n```\n\n## 🔑 JetBrains OS licenses\n\nThe `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.\n\n\u003ca href=\"https://www.jetbrains.com/?from=FF.PyAdmin\" target=\"_blank\"\u003e\u003cimg src=\"https://resources.jetbrains.com/storage/products/company/brand/logos/jetbrains.svg\" alt=\"JetBrains logo.\"\u003e\u003c/a\u003e\n\n\n\n\n*ff*","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffufuok%2Futils","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffufuok%2Futils","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffufuok%2Futils/lists"}