{"id":13490440,"url":"https://github.com/gookit/goutil","last_synced_at":"2026-03-12T09:30:05.938Z","repository":{"id":37664088,"uuid":"139544571","full_name":"gookit/goutil","owner":"gookit","description":"💪 Helper Utils(800+): int, byte, string, array/slice, map, struct, dump, convert/format, error, web/http, cli/flag, OS/ENV, filesystem, system, test/assert, time and more. Go 常用的一些工具函数：数字，字符串，数组，Map，结构体，反射，文本，文件，错误，时间日期，特殊处理，格式化，常用信息获取等等","archived":false,"fork":false,"pushed_at":"2025-04-07T15:08:15.000Z","size":2742,"stargazers_count":2137,"open_issues_count":5,"forks_count":190,"subscribers_count":35,"default_branch":"master","last_synced_at":"2025-04-23T16:08:08.380Z","etag":null,"topics":["casting","cli-utilities","converter","dumper","environments","errors","filesystem","go-errors","go-flags","go-library","go-utils","golang","string","strings","system-utils","testing-tools","time-format","tools","utilities","utils"],"latest_commit_sha":null,"homepage":"https://pkg.go.dev/github.com/gookit/goutil","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/gookit.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,"zenodo":null}},"created_at":"2018-07-03T07:25:04.000Z","updated_at":"2025-04-22T02:56:07.000Z","dependencies_parsed_at":"2024-03-24T06:27:27.726Z","dependency_job_id":"e5d0ab10-b05a-4a62-9e91-ce81e3aeb426","html_url":"https://github.com/gookit/goutil","commit_stats":{"total_commits":1007,"total_committers":28,"mean_commits":"35.964285714285715","dds":"0.11717974180734858","last_synced_commit":"ba0623b2a2d173c1839e8d9660706700a5742c5d"},"previous_names":[],"tags_count":85,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gookit%2Fgoutil","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gookit%2Fgoutil/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gookit%2Fgoutil/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gookit%2Fgoutil/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gookit","download_url":"https://codeload.github.com/gookit/goutil/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253745693,"owners_count":21957429,"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":["casting","cli-utilities","converter","dumper","environments","errors","filesystem","go-errors","go-flags","go-library","go-utils","golang","string","strings","system-utils","testing-tools","time-format","tools","utilities","utils"],"created_at":"2024-07-31T19:00:46.664Z","updated_at":"2026-03-12T09:30:05.921Z","avatar_url":"https://github.com/gookit.png","language":"Go","readme":"# GoUtil\n\n![GitHub go.mod Go version](https://img.shields.io/github/go-mod/go-version/gookit/goutil?style=flat-square)\n[![GitHub tag (latest SemVer)](https://img.shields.io/github/tag/gookit/goutil)](https://github.com/gookit/goutil)\n[![Go Report Card](https://goreportcard.com/badge/github.com/gookit/goutil)](https://goreportcard.com/report/github.com/gookit/goutil)\n[![Unit-Tests](https://github.com/gookit/goutil/workflows/Unit-Tests/badge.svg)](https://github.com/gookit/goutil/actions)\n[![Coverage Status](https://coveralls.io/repos/github/gookit/goutil/badge.svg?branch=master)](https://coveralls.io/github/gookit/goutil?branch=master)\n[![Go Reference](https://pkg.go.dev/badge/github.com/gookit/goutil.svg)](https://pkg.go.dev/github.com/gookit/goutil)\n\n💪 Useful utils(**900+**) package for the Go: int, string, array/slice, map, struct, reflect, error, time, format, CLI, ENV, filesystem, system, testing and more.\n\n\u003e **[中文说明](README.zh-CN.md)**\n\n## Packages\n\n### Basic packages\n\n- [`arrutil`](arrutil): Array/Slice util functions. eg: check, convert, formatting, enum, collections\n- [`byteutil`](byteutil): Provide some common bytes util functions. eg: convert, check and more\n- [`maputil`](maputil) Map data util functions. eg: convert, sub-value get, simple merge\n- [`mathutil`](mathutil) Math(int, number) util functions. eg: convert, math calc, random\n- [`reflects`](reflects) Provide extends reflect util functions.\n- [`structs`](structs) Provide some extends util functions for struct. eg: tag parse, struct data init\n- [`strutil`](strutil) String util functions. eg: bytes, check, convert, encode, format and more\n- [`sysutil`](sysutil) System util functions. eg: sysenv, exec, user, process\n- [`cliutil`](cliutil) Command-line util functions. eg: colored print, read input, exec command\n- [`envutil`](envutil) ENV util for current runtime env information. eg: get one, get info, parse var\n- [`fsutil`](fsutil) Filesystem util functions, quick create, read and write file. eg: file and dir check, operate\n- [`jsonutil`](jsonutil) Provide some util functions for quick read, write, encode, decode JSON data.\n\n### Debug \u0026 Test \u0026 Errors\n\n- [`dump`](dump): GO value printing tool. print slice, map will auto wrap each element and display the call location\n- [`errorx`](errorx) Provide an enhanced error implements for go, allow with stacktrace and wrap another error.\n- [`assert`](testutil/assert) Provides commonly asserts functions for help testing\n- [`testutil`](testutil) Test help util functions. eg: http test, mock ENV value\n- [`fakeobj`](x/fakeobj) provides a fake object for testing. such as fake fs.File, fs.FileInfo, fs.DirEntry etc.\n\n### Extra Tools packages\n\n- [`cflag`](cflag):  Wraps and extends go `flag.FlagSet` to build simple command line applications\n- [`ccolor`](x/ccolor): Simple command-line color output library that uses ANSI color codes to output text with colors.\n- [`timex`](timex) Provides an enhanced time.Time implementation. Add more commonly used functional methods\n  - Provides datetime format parsing like `Y-m-d H:i:s`\n  - such as: DayStart(), DayAfter(), DayAgo(), DateFormat() and more.\n- [httpreq](netutil/httpreq) An easier-to-use HTTP client that wraps http.Client, and with some http utils.\n- [syncs](syncs) Provides synchronization primitives util functions.\n\n**More ...**\n\n- [`cmdline`](cliutil/cmdline) Provide cmdline parse, args build to cmdline\n- [`encodes`](encodes): Provide some encoding/decoding, hash, crypto util functions. eg: base64, hex, etc.\n- [`finder`](x/finder) Provides a simple and convenient file/dir lookup function, supports filtering, excluding, matching, ignoring, etc.\n- [`netutil`](netutil) Network util functions. eg: Ip, IpV4, IpV6, Mac, Port, Hostname, etc.\n- [`textutil`](strutil/textutil) Provide some extensions text handle util functions. eg: text replace, etc.\n- [`textscan`](strutil/textscan) Implemented a parser that quickly scans and analyzes text content. It can be used to parse INI, Properties and other formats\n- [`cmdr`](sysutil/cmdr) Provide for quick build and run a cmd, batch run multi cmd tasks\n- [`clipboard`](x/clipboard) Provide a simple clipboard read and write operations.\n- [`process`](sysutil/process) Provide some process handle util functions.\n- [`fmtutil`](x/fmtutil) Format data util functions. eg: data, size, time\n- [`goinfo`](x/goinfo) provide some standard util functions for go.\n\n## Go Doc\n\nPlease see [Go doc](https://pkg.go.dev/github.com/gookit/goutil).\nWiki docs on [ZRead.ai - gookit/goutil](https://zread.ai/gookit/goutil)\n\n## Install\n\n```shell\ngo get github.com/gookit/goutil\n```\n\n## Usage\n\n```go\n// github.com/gookit/goutil\nis.True(goutil.IsEmpty(nil))\nis.False(goutil.IsEmpty(\"abc\"))\n\nis.True(goutil.IsEqual(\"a\", \"a\"))\nis.True(goutil.IsEqual([]string{\"a\"}, []string{\"a\"}))\nis.True(goutil.IsEqual(23, 23))\n\nis.True(goutil.Contains(\"abc\", \"a\"))\nis.True(goutil.Contains([]string{\"abc\", \"def\"}, \"abc\"))\nis.True(goutil.Contains(map[int]string{2: \"abc\", 4: \"def\"}, 4))\n\n// convert type\nstr = goutil.String(23) // \"23\"\niVal = goutil.Int(\"-2\") // 2\ni64Val = goutil.Int64(\"-2\") // -2\nu64Val = goutil.Uint(\"2\") // 2\n```\n\n### Dump go variable\n\n```go\ndump.Print(somevar, somevar2, ...)\n```\n\n**dump nested struct**\n\n![preview-nested-struct](dump/_examples/preview-nested-struct.png)\n\n## Packages\n\n### Array and Slice\n\n\u003e Package `github.com/gookit/goutil/arrutil`\n\n\u003cdetails\u003e\u003csummary\u003eClick to see functions 👈\u003c/summary\u003e\n\n```go\n// source at arrutil/arrutil.go\nfunc GetRandomOne[T any](arr []T) T\nfunc RandomOne[T any](arr []T) T\n// source at arrutil/check.go\nfunc SliceHas[T comdef.ScalarType](slice []T, val T) bool\nfunc IntsHas[T comdef.Integer](ints []T, val T) bool\nfunc Int64sHas(ints []int64, val int64) bool\nfunc StringsHas[T ~string](ss []T, val T) bool\nfunc InStrings[T ~string](elem T, ss []T) bool\nfunc NotIn[T comdef.ScalarType](value T, list []T) bool\nfunc In[T comdef.ScalarType](value T, list []T) bool\nfunc ContainsAll[T comdef.ScalarType](list, values []T) bool\nfunc IsSubList[T comdef.ScalarType](values, list []T) bool\nfunc IsParent[T comdef.ScalarType](values, list []T) bool\nfunc HasValue(arr, val any) bool\nfunc Contains(arr, val any) bool\nfunc NotContains(arr, val any) bool\n// source at arrutil/collection.go\nfunc StringEqualsComparer(a, b string) int\nfunc ValueEqualsComparer[T comdef.Compared](a, b T) int\nfunc ReflectEqualsComparer[T any](a, b T) int\nfunc ElemTypeEqualsComparer[T any](a, b T) int\nfunc TwowaySearch[T any](data []T, item T, fn Comparer[T]) (int, error)\nfunc CloneSlice[T any](data []T) []T\nfunc Diff[T any](first, second []T, fn Comparer[T]) []T\nfunc Differences[T any](first, second []T, fn Comparer[T]) []T\nfunc Excepts[T any](first, second []T, fn Comparer[T]) []T\nfunc Intersects[T any](first, second []T, fn Comparer[T]) []T\nfunc Union[T any](first, second []T, fn Comparer[T]) []T\nfunc Find[T any](source []T, fn Predicate[T]) (v T, err error)\nfunc FindOrDefault[T any](source []T, fn Predicate[T], defaultValue T) T\nfunc TakeWhile[T any](data []T, fn Predicate[T]) []T\nfunc ExceptWhile[T any](data []T, fn Predicate[T]) []T\n// source at arrutil/convert.go\nfunc JoinStrings(sep string, ss ...string) string\nfunc StringsJoin(sep string, ss ...string) string\nfunc JoinTyped[T any](sep string, arr ...T) string\nfunc JoinSlice(sep string, arr ...any) string\nfunc IntsToString[T comdef.Integer](ints []T) string\nfunc ToInt64s(arr any) (ret []int64, err error)\nfunc MustToInt64s(arr any) []int64\nfunc SliceToInt64s(arr []any) []int64\nfunc ToMap[T any, K comdef.ScalarType, V any](list []T, mapFn func(T) (K, V)) map[K]V\nfunc AnyToSlice(sl any) (ls []any, err error)\nfunc AnyToStrings(arr any) []string\nfunc MustToStrings(arr any) []string\nfunc ToStrings(arr any) (ret []string, err error)\nfunc SliceToStrings(arr []any) []string\nfunc QuietStrings(arr []any) []string\nfunc ConvType[T any, R any](arr []T, newElemTyp R) ([]R, error)\nfunc AnyToString(arr any) string\nfunc SliceToString(arr ...any) string\nfunc ToString[T any](arr []T) string\nfunc CombineToMap[K comdef.SortedType, V any](keys []K, values []V) map[K]V\nfunc CombineToSMap(keys, values []string) map[string]string\n// source at arrutil/format.go\nfunc NewFormatter(arr any) *ArrFormatter\nfunc FormatIndent(arr any, indent string) string\n// source at arrutil/process.go\nfunc Reverse[T any](ls []T)\nfunc Remove[T comdef.Compared](ls []T, val T) []T\nfunc Filter[T any](ls []T, filter ...comdef.MatchFunc[T]) []T\nfunc Map[T, V any](list []T, mapFn MapFn[T, V]) []V\nfunc Map1[T, R any](list []T, fn func(t T) R) []R\nfunc Column[T any, V any](list []T, mapFn func(obj T) (val V, find bool)) []V\nfunc Unique[T comdef.NumberOrString](list []T) []T\nfunc IndexOf[T comdef.NumberOrString](val T, list []T) int\nfunc FirstOr[T any](list []T, defVal ...T) T\n// source at arrutil/strings.go\nfunc StringsToAnys(ss []string) []any\nfunc StringsToSlice(ss []string) []any\nfunc StringsAsInts(ss []string) []int\nfunc StringsToInts(ss []string) (ints []int, err error)\nfunc StringsTryInts(ss []string) (ints []int, err error)\nfunc StringsUnique(ss []string) []string\nfunc StringsContains(ss []string, s string) bool\nfunc StringsRemove(ss []string, s string) []string\nfunc StringsFilter(ss []string, filter ...comdef.StringMatchFunc) []string\nfunc StringsMap(ss []string, mapFn func(s string) string) []string\nfunc TrimStrings(ss []string, cutSet ...string) []string\n```\n\u003c/details\u003e\n\n#### ArrUtil Usage\n\n**check value**:\n\n```go\narrutil.IntsHas([]int{2, 4, 5}, 2) // True\narrutil.Int64sHas([]int64{2, 4, 5}, 2) // True\narrutil.StringsHas([]string{\"a\", \"b\"}, \"a\") // True\n\n// list and val interface{}\narrutil.Contains(list, val)\narrutil.Contains([]uint32{9, 2, 3}, 9) // True\n```\n\n**convert**:\n\n```go\nints, err := arrutil.ToInt64s([]string{\"1\", \"2\"}) // ints: []int64{1, 2} \nss, err := arrutil.ToStrings([]int{1, 2}) // ss: []string{\"1\", \"2\"}\n```\n\n\n\n### Bytes Utils\n\n\u003e Package `github.com/gookit/goutil/byteutil`\n\n\u003cdetails\u003e\u003csummary\u003eClick to see functions 👈\u003c/summary\u003e\n\n```go\n// source at byteutil/buffer.go\nfunc NewBuffer() *Buffer\n// source at byteutil/byteutil.go\nfunc Md5(src any) []byte\nfunc Md5Sum(src any) []byte\nfunc ShortMd5(src any) []byte\nfunc Random(length int) ([]byte, error)\nfunc FirstLine(bs []byte) []byte\nfunc AppendAny(dst []byte, v any) []byte\nfunc Cut(bs []byte, sep byte) (before, after []byte, found bool)\nfunc SafeCut(bs []byte, sep byte) (before, after []byte)\nfunc SafeCuts(bs []byte, sep []byte) (before, after []byte)\n// source at byteutil/check.go\nfunc IsNumChar(c byte) bool\nfunc IsAlphaChar(c byte) bool\n// source at byteutil/conv.go\nfunc StrOrErr(bs []byte, err error) (string, error)\nfunc SafeString(bs []byte, err error) string\nfunc String(b []byte) string\nfunc ToString(b []byte) string\nfunc ToBytes(v any) ([]byte, error)\nfunc SafeBytes(v any) []byte\nfunc ToBytesWithFunc(v any, usrFn ToBytesFunc) ([]byte, error)\n// source at byteutil/encoder.go\nfunc NewStdEncoder(encFn BytesEncodeFunc, decFn BytesDecodeFunc) *StdEncoder\n// source at byteutil/pool.go\nfunc NewChanPool(chSize int, width int, capWidth int) *ChanPool\n```\n\u003c/details\u003e\n\n\n### Cflag\n\n\u003e Package `github.com/gookit/goutil/cflag`\n\n`cflag` - Wraps and extends go `flag.FlagSet` to build simple command line applications\n\n\n\u003cdetails\u003e\u003csummary\u003eClick to see functions 👈\u003c/summary\u003e\n\n```go\n// source at cflag/cflag.go\nfunc New(fns ...func(c *CFlags)) *CFlags\nfunc NewWith(name, version, desc string, fns ...func(c *CFlags)) *CFlags\nfunc NewEmpty(fns ...func(c *CFlags)) *CFlags\nfunc WithDesc(desc string) func(c *CFlags)\nfunc WithVersion(version string) func(c *CFlags)\n// source at cflag/ext.go\nfunc LimitInt(min, max int) comdef.IntCheckFunc\nfunc NewIntVar(checkFn comdef.IntCheckFunc) IntVar\nfunc NewStrVar(checkFn comdef.StrCheckFunc) StrVar\nfunc NewEnumString(enum ...string) EnumString\nfunc NewKVString() KVString\nfunc Value\n// source at cflag/optarg.go\nfunc NewArg(name, desc string, required bool) *FlagArg\n// source at cflag/util.go\nfunc SetDebug(open bool)\nfunc DebugMsg(format string, args ...any)\nfunc IsGoodName(name string) bool\nfunc IsZeroValue(opt *flag.Flag, value string) (bool, bool)\nfunc AddPrefix(name string) string\nfunc AddPrefixes(name string, shorts []string) string\nfunc AddPrefixes2(name string, shorts []string, nameAtEnd bool) string\nfunc SplitShortcut(shortcut string) []string\nfunc FilterNames(names []string) []string\nfunc IsFlagHelpErr(err error) bool\nfunc WrapColorForCode(s string) string\nfunc ReplaceShorts(args []string, shortsMap map[string]string) []string\n```\n\u003c/details\u003e\n\n#### `cflag` Usage\n\n`cflag` usage please see [cflag/README.md](cflag/README.md)\n\n\n\n### CLI Utils\n\n\u003e Package `github.com/gookit/goutil/cliutil`\n\n\u003cdetails\u003e\u003csummary\u003eClick to see functions 👈\u003c/summary\u003e\n\n```go\n// source at cliutil/cliutil.go\nfunc SplitMulti(ss []string, sep string) []string\nfunc LineBuild(binFile string, args []string) string\nfunc BuildLine(binFile string, args []string) string\nfunc String2OSArgs(line string) []string\nfunc StringToOSArgs(line string) []string\nfunc ParseLine(line string) []string\nfunc QuickExec(cmdLine string, workDir ...string) (string, error)\nfunc ExecLine(cmdLine string, workDir ...string) (string, error)\nfunc ExecCmd(binName string, args []string, workDir ...string) (string, error)\nfunc ExecCommand(binName string, args []string, workDir ...string) (string, error)\nfunc ShellExec(cmdLine string, shells ...string) (string, error)\nfunc CurrentShell(onlyName bool) (path string)\nfunc HasShellEnv(shell string) bool\nfunc BuildOptionHelpName(names []string) string\nfunc ShellQuote(s string) string\nfunc OutputLines(output string) []string\n// source at cliutil/info.go\nfunc Workdir() string\nfunc BinDir() string\nfunc BinFile() string\nfunc BinName() string\nfunc GetTermSize(refresh ...bool) (w int, h int)\n// source at cliutil/read.go\nfunc ReadInput(question string) (string, error)\nfunc ReadLine(question string) (string, error)\nfunc ReadFirst(question string) (string, error)\nfunc ReadFirstByte(question string) (byte, error)\nfunc ReadFirstRune(question string) (rune, error)\nfunc ReadAsBool(tip string, defVal bool) bool\nfunc Confirm(tip string, defVal ...bool) bool\nfunc InputIsYes(ans string) bool\nfunc ByteIsYes(ans byte) bool\nfunc ReadPassword(question ...string) string\n```\n\u003c/details\u003e\n\n\n#### CLI Util Usage\n\n**helper functions:**\n\n```go\ncliutil.Workdir() // current workdir\ncliutil.BinDir() // the program exe file dir\n\ncliutil.ReadInput(\"Your name?\")\ncliutil.ReadPassword(\"Input password:\")\nans, _ := cliutil.ReadFirstByte(\"continue?[y/n] \")\n```\n\n**cmdline parse:**\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/gookit/goutil/cliutil\"\n\t\"github.com/gookit/goutil/dump\"\n)\n\nfunc main() {\n\targs := cliutil.ParseLine(`./app top sub --msg \"has multi words\"`)\n\tdump.P(args)\n\n\ts := cliutil.BuildLine(\"./myapp\", []string{\n\t\t\"-a\", \"val0\",\n\t\t\"-m\", \"this is message\",\n\t\t\"arg0\",\n\t})\n\tfmt.Println(\"Build line:\", s)\n}\n```\n\n**output**:\n\n```shell\nPRINT AT github.com/gookit/goutil/cliutil_test.TestParseLine(line_parser_test.go:30)\n[]string [ #len=5\n  string(\"./app\"), #len=5\n  string(\"top\"), #len=3\n  string(\"sub\"), #len=3\n  string(\"--msg\"), #len=5\n  string(\"has multi words\"), #len=15\n]\n\nBuild line: ./myapp -a val0 -m \"this is message\" arg0\n```\n\n\u003e More, please see [./cliutil/README](cliutil/README.md)\n\n\n### Var Dumper\n\n\u003e Package `github.com/gookit/goutil/dump`\n\n\u003cdetails\u003e\u003csummary\u003eClick to see functions 👈\u003c/summary\u003e\n\n```go\n// source at dump/dump.go\nfunc Std() *Dumper\nfunc Reset()\nfunc Config(fns ...OptionFunc)\nfunc Print(vs ...any)\nfunc Println(vs ...any)\nfunc Fprint(w io.Writer, vs ...any)\nfunc Std2() *Dumper\nfunc Reset2()\nfunc Format(vs ...any) string\nfunc NoLoc(vs ...any)\nfunc Clear(vs ...any)\n// source at dump/dumper.go\nfunc NewDumper(out io.Writer, skip int) *Dumper\nfunc NewWithOptions(fns ...OptionFunc) *Dumper\n// source at dump/options.go\nfunc NewDefaultOptions(out io.Writer, skip int) *Options\nfunc SkipNilField() OptionFunc\nfunc SkipPrivate() OptionFunc\nfunc BytesAsString() OptionFunc\nfunc WithCallerSkip(skip int) OptionFunc\nfunc WithoutPosition() OptionFunc\nfunc WithoutOutput(out io.Writer) OptionFunc\nfunc WithoutColor() OptionFunc\nfunc WithoutType() OptionFunc\nfunc WithoutLen() OptionFunc\n```\n\u003c/details\u003e\n\n#### Examples\n\nexample code:\n\n```go\npackage main\n\nimport \"github.com/gookit/goutil/dump\"\n\n// rum demo:\n// \tgo run ./dump/_examples/demo1.go\nfunc main() {\n\totherFunc1()\n}\n\nfunc otherFunc1() {\n\tdump.P(\n\t\t23,\n\t\t[]string{\"ab\", \"cd\"},\n\t\t[]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}, // len \u003e 10\n\t\tmap[string]interface{}{\n\t\t\t\"key\": \"val\", \"sub\": map[string]string{\"k\": \"v\"},\n\t\t},\n\t\tstruct {\n\t\t\tab string\n\t\t\tCd int\n\t\t}{\n\t\t\t\"ab\", 23,\n\t\t},\n\t)\n}\n```\n\nPreview:\n\n![](dump/_examples/preview-demo1.png)\n\n**nested struct**\n\n\u003e source code at `dump/dumper_test.TestStruct_WithNested`\n\n![](dump/_examples/preview-nested-struct.png)\n\n\n\n### ENV/Environment\n\n\u003e Package `github.com/gookit/goutil/envutil`\n\n\u003cdetails\u003e\u003csummary\u003eClick to see functions 👈\u003c/summary\u003e\n\n```go\n// source at envutil/envutil.go\nfunc VarReplace(s string) string\nfunc ParseOrErr(val string) (string, error)\nfunc ParseValue(val string) string\nfunc VarParse(val string) string\nfunc ParseEnvValue(val string) string\nfunc SplitText2map(text string) map[string]string\nfunc SplitLineToKv(line string) (string, string)\n// source at envutil/get.go\nfunc Getenv(name string, def ...string) string\nfunc MustGet(name string) string\nfunc GetInt(name string, def ...int) int\nfunc GetBool(name string, def ...bool) bool\nfunc GetOne(names []string, defVal ...string) string\nfunc GetMulti(names ...string) map[string]string\nfunc OnExist(name string, fn func(val string)) bool\nfunc EnvPaths() []string\nfunc EnvMap() map[string]string\nfunc Environ() map[string]string\nfunc SearchEnvKeys(keywords string) map[string]string\nfunc SearchEnv(keywords string, matchValue bool) map[string]string\n// source at envutil/info.go\nfunc IsWin() bool\nfunc IsWindows() bool\nfunc IsMac() bool\nfunc IsLinux() bool\nfunc IsMSys() bool\nfunc IsTerminal(fd uintptr) bool\nfunc StdIsTerminal() bool\nfunc IsConsole(out io.Writer) bool\nfunc HasShellEnv(shell string) bool\nfunc IsSupportColor() bool\nfunc IsSupport256Color() bool\nfunc IsSupportTrueColor() bool\nfunc IsGithubActions() bool\n// source at envutil/set.go\nfunc SetEnvMap(mp map[string]string)\nfunc SetEnvs(kvPairs ...string)\nfunc UnsetEnvs(keys ...string)\nfunc LoadText(text string)\nfunc LoadString(line string) bool\n```\n\u003c/details\u003e\n\n#### ENV Util Usage\n\n**helper functions:**\n\n```go\nenvutil.IsWin()\nenvutil.IsMac()\nenvutil.IsLinux()\n\n// get ENV value by key, can with default value\nenvutil.Getenv(\"APP_ENV\", \"dev\")\nenvutil.GetInt(\"LOG_LEVEL\", 1)\nenvutil.GetBool(\"APP_DEBUG\", true)\n\n// parse ENV var value from input string, support default value.\nenvutil.ParseValue(\"${ENV_NAME | defValue}\")\n```\n\n\n\n### Errorx\n\n\u003e Package `github.com/gookit/goutil/errorx`\n\n`errorx` provides an enhanced error reporting implementation that contains call stack information and can wrap the previous level of error.\n\n\u003e Additional call stack information is included when printing errors, making it easy to log and find problems.\n\n\n\u003cdetails\u003e\u003csummary\u003eClick to see functions 👈\u003c/summary\u003e\n\n```go\n// source at errorx/assert.go\nfunc IsTrue(result bool, fmtAndArgs ...any) error\nfunc IsFalse(result bool, fmtAndArgs ...any) error\nfunc IsIn[T comdef.ScalarType](value T, list []T, fmtAndArgs ...any) error\nfunc NotIn[T comdef.ScalarType](value T, list []T, fmtAndArgs ...any) error\n// source at errorx/errors.go\nfunc NewR(code int, msg string) ErrorR\nfunc Fail(code int, msg string) ErrorR\nfunc Failf(code int, tpl string, v ...any) ErrorR\nfunc Suc(msg string) ErrorR\n// source at errorx/errorx.go\nfunc New(msg string) error\nfunc Newf(tpl string, vars ...any) error\nfunc Errorf(tpl string, vars ...any) error\nfunc With(err error, msg string) error\nfunc Withf(err error, tpl string, vars ...any) error\nfunc WithPrev(err error, msg string) error\nfunc WithPrevf(err error, tpl string, vars ...any) error\nfunc WithStack(err error) error\nfunc Traced(err error) error\nfunc Stacked(err error) error\nfunc WithOptions(msg string, fns ...func(opt *ErrStackOpt)) error\nfunc Wrap(err error, msg string) error\nfunc Wrapf(err error, tpl string, vars ...any) error\n// source at errorx/stack.go\nfunc FuncForPC(pc uintptr) *Func\nfunc ResetStdOpt()\nfunc Config(fns ...func(opt *ErrStackOpt))\nfunc SkipDepth(skipDepth int) func(opt *ErrStackOpt)\nfunc TraceDepth(traceDepth int) func(opt *ErrStackOpt)\n// source at errorx/util.go\nfunc Err(msg string) error\nfunc Raw(msg string) error\nfunc Ef(tpl string, vars ...any) error\nfunc Errf(tpl string, vars ...any) error\nfunc Rf(tpl string, vs ...any) error\nfunc Rawf(tpl string, vs ...any) error\nfunc Cause(err error) error\nfunc Unwrap(err error) error\nfunc Previous(err error) error\nfunc IsErrorX(err error) (ok bool)\nfunc ToErrorX(err error) (ex *ErrorX, ok bool)\nfunc MustEX(err error) *ErrorX\nfunc Has(err, target error) bool\nfunc Is(err, target error) bool\nfunc To(err error, target any) bool\nfunc As(err error, target any) bool\n```\n\u003c/details\u003e\n\n\n#### Errorx Usage\n\n**Create error with call stack info**\n\n- use the `errorx.New` instead `errors.New`\n\n```go\nfunc doSomething() error {\n    if false {\n\t    // return errors.New(\"a error happen\")\n\t    return errorx.New(\"a error happen\")\n\t}\n}\n```\n\n- use the `errorx.Newf` or `errorx.Errorf` instead `fmt.Errorf`\n\n```go\nfunc doSomething() error {\n    if false {\n\t    // return fmt.Errorf(\"a error %s\", \"happen\")\n\t    return errorx.Newf(\"a error %s\", \"happen\")\n\t}\n}\n```\n\n**Wrap the previous error**\n\nused like this before:\n\n```go\n    if err := SomeFunc(); err != nil {\n\t    return err\n\t}\n```\n\ncan be replaced with:\n\n```go\n    if err := SomeFunc(); err != nil {\n\t    return errors.Stacked(err)\n\t}\n```\n\n**Print the errorx.New() error**\n\nExamples for use `errorx` package, more please see [./errorx/README](errorx/README.md)\n\n```go\n    err := errorx.New(\"the error message\")\n\n    fmt.Println(err)\n    // fmt.Printf(\"%v\\n\", err)\n    // fmt.Printf(\"%#v\\n\", err)\n```\n\n\u003e from the test: `errorx/errorx_test.TestNew()`\n\n**Output**:\n\n```text\nthe error message\nSTACK:\ngithub.com/gookit/goutil/errorx_test.returnXErr()\n  /Users/inhere/Workspace/godev/gookit/goutil/errorx/errorx_test.go:21\ngithub.com/gookit/goutil/errorx_test.returnXErrL2()\n  /Users/inhere/Workspace/godev/gookit/goutil/errorx/errorx_test.go:25\ngithub.com/gookit/goutil/errorx_test.TestNew()\n  /Users/inhere/Workspace/godev/gookit/goutil/errorx/errorx_test.go:29\ntesting.tRunner()\n  /usr/local/Cellar/go/1.18/libexec/src/testing/testing.go:1439\nruntime.goexit()\n  /usr/local/Cellar/go/1.18/libexec/src/runtime/asm_amd64.s:1571\n```\n\n\n\n### File System\n\n\u003e Package `github.com/gookit/goutil/fsutil`\n\nPackage `fsutil` Filesystem util functions: quick check, create, read and write file. eg: file and dir check, operate\n\n\n\u003cdetails\u003e\u003csummary\u003eClick to see functions 👈\u003c/summary\u003e\n\n```go\n// source at fsutil/check.go\nfunc PathExists(path string) bool\nfunc IsDir(path string) bool\nfunc FileExists(path string) bool\nfunc IsFile(path string) bool\nfunc IsSymlink(path string) bool\nfunc IsAbsPath(aPath string) bool\nfunc IsEmptyDir(dirPath string) bool\nfunc IsImageFile(path string) bool\nfunc IsZipFile(filepath string) bool\nfunc PathMatch(pattern, s string) bool\n// source at fsutil/define.go\nfunc NewEntry(fPath string, ent fs.DirEntry) Entry\nfunc NewFileInfo(fPath string, info fs.FileInfo) FileInfo\n// source at fsutil/find.go\nfunc FilePathInDirs(fPath string, dirs ...string) string\nfunc FirstExists(paths ...string) string\nfunc FirstExistsDir(paths ...string) string\nfunc FirstExistsFile(paths ...string) string\nfunc MatchPaths(paths []string, matcher PathMatchFunc) []string\nfunc MatchFirst(paths []string, matcher PathMatchFunc, defaultPath string) string\nfunc FindAllInParentDirs(dirPath, name string, optFns ...FindParentOptFn) []string\nfunc FindOneInParentDirs(dirPath, name string, optFns ...FindParentOptFn) string\nfunc FindNameInParentDirs(dirPath, name string, collectFn func(fullPath string), optFns ...FindParentOptFn)\nfunc FindInParentDirs(dirPath string, matchFunc func(dir string) bool, maxLevel int)\nfunc SearchNameUp(dirPath, name string) string\nfunc SearchNameUpx(dirPath, name string) (string, bool)\nfunc WalkDir(dir string, fn fs.WalkDirFunc) error\nfunc Glob(pattern string, fls ...NameMatchFunc) []string\nfunc GlobWithFunc(pattern string, fn func(filePath string) error) (err error)\nfunc OnlyFindDir(_ string, ent fs.DirEntry) bool\nfunc OnlyFindFile(_ string, ent fs.DirEntry) bool\nfunc ExcludeNames(names ...string) FilterFunc\nfunc IncludeSuffix(ss ...string) FilterFunc\nfunc ExcludeDotFile(_ string, ent fs.DirEntry) bool\nfunc ExcludeSuffix(ss ...string) FilterFunc\nfunc ApplyFilters(fPath string, ent fs.DirEntry, filters []FilterFunc) bool\nfunc FindInDir(dir string, handleFn HandleFunc, filters ...FilterFunc) (e error)\nfunc FileInDirs(paths []string, names ...string) string\n// source at fsutil/fsutil.go\nfunc JoinPaths(elem ...string) string\nfunc JoinPaths3(basePath, secPath string, elems ...string) string\nfunc JoinSubPaths(basePath string, elems ...string) string\nfunc SlashPath(path string) string\nfunc UnixPath(path string) string\nfunc ToAbsPath(p string) string\nfunc Must2(_ any, err error)\n// source at fsutil/info.go\nfunc DirPath(fPath string) string\nfunc Dir(fPath string) string\nfunc PathName(fPath string) string\nfunc PathNoExt(fPath string) string\nfunc Name(fPath string) string\nfunc NameNoExt(fPath string) string\nfunc FileExt(fPath string) string\nfunc Extname(fPath string) string\nfunc Suffix(fPath string) string\nfunc Expand(pathStr string) string\nfunc ExpandHome(pathStr string) string\nfunc ExpandPath(pathStr string) string\nfunc ResolvePath(pathStr string) string\nfunc SplitPath(pathStr string) (dir, name string)\nfunc UserHomeDir() string\nfunc HomeDir() string\n// source at fsutil/info_nonwin.go\nfunc Realpath(pathStr string) string\n// source at fsutil/mime.go\nfunc DetectMime(path string) string\nfunc MimeType(path string) (mime string)\nfunc ReaderMimeType(r io.Reader) (mime string)\n// source at fsutil/operate.go\nfunc Mkdir(dirPath string, perm fs.FileMode) error\nfunc MkdirQuick(dirPath string) error\nfunc EnsureDir(path string) error\nfunc MkDirs(perm fs.FileMode, dirPaths ...string) error\nfunc MkSubDirs(perm fs.FileMode, parentDir string, subDirs ...string) error\nfunc MkParentDir(fpath string) error\nfunc NewOpenOption(optFns ...OpenOptionFunc) *OpenOption\nfunc OpenOptOrNew(opt *OpenOption) *OpenOption\nfunc WithFlag(flag int) OpenOptionFunc\nfunc WithPerm(perm os.FileMode) OpenOptionFunc\nfunc OpenFile(filePath string, flag int, perm os.FileMode) (*os.File, error)\nfunc MustOpenFile(filePath string, flag int, perm os.FileMode) *os.File\nfunc QuickOpenFile(filepath string, fileFlag ...int) (*os.File, error)\nfunc OpenAppendFile(filepath string, filePerm ...os.FileMode) (*os.File, error)\nfunc OpenTruncFile(filepath string, filePerm ...os.FileMode) (*os.File, error)\nfunc OpenReadFile(filepath string) (*os.File, error)\nfunc CreateFile(fpath string, filePerm, dirPerm os.FileMode, fileFlag ...int) (*os.File, error)\nfunc MustCreateFile(filePath string, filePerm, dirPerm os.FileMode) *os.File\nfunc Remove(fPath string) error\nfunc MustRemove(fPath string)\nfunc QuietRemove(fPath string)\nfunc SafeRemoveAll(path string)\nfunc RmIfExist(fPath string) error\nfunc DeleteIfExist(fPath string) error\nfunc RmFileIfExist(fPath string) error\nfunc DeleteIfFileExist(fPath string) error\nfunc RemoveSub(dirPath string, fns ...FilterFunc) error\nfunc Unzip(archive, targetDir string) (err error)\n// source at fsutil/opread.go\nfunc NewIOReader(in any) (r io.Reader, err error)\nfunc DiscardReader(src io.Reader)\nfunc ReadFile(filePath string) []byte\nfunc MustReadFile(filePath string) []byte\nfunc ReadReader(r io.Reader) []byte\nfunc MustReadReader(r io.Reader) []byte\nfunc ReadString(in any) string\nfunc ReadStringOrErr(in any) (string, error)\nfunc ReadAll(in any) []byte\nfunc GetContents(in any) []byte\nfunc MustRead(in any) []byte\nfunc ReadOrErr(in any) ([]byte, error)\nfunc ReadExistFile(filePath string) []byte\nfunc TextScanner(in any) *scanner.Scanner\nfunc LineScanner(in any) *bufio.Scanner\n// source at fsutil/opwrite.go\nfunc OSTempFile(pattern string) (*os.File, error)\nfunc TempFile(dir, pattern string) (*os.File, error)\nfunc OSTempDir(pattern string) (string, error)\nfunc TempDir(dir, pattern string) (string, error)\nfunc MustSave(filePath string, data any, optFns ...OpenOptionFunc)\nfunc SaveFile(filePath string, data any, optFns ...OpenOptionFunc) error\nfunc WriteData(filePath string, data any, fileFlag ...int) (int, error)\nfunc PutContents(filePath string, data any, fileFlag ...int) (int, error)\nfunc WriteFile(filePath string, data any, perm os.FileMode, fileFlag ...int) error\nfunc WriteOSFile(f *os.File, data any) (n int, err error)\nfunc CopyFile(srcPath, dstPath string) error\nfunc MustCopyFile(srcPath, dstPath string)\nfunc UpdateContents(filePath string, handleFn func(bs []byte) []byte) error\nfunc CreateSymlink(target, linkPath string) error\n```\n\u003c/details\u003e\n\n\n#### FsUtil Usage\n\n**files finder:**\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"io/fs\"\n\n\t\"github.com/gookit/goutil/fsutil\"\n)\n\nfunc main() {\n\t// find all files in dir\n\tfsutil.FindInDir(\"./\", func(filePath string, de fs.DirEntry) error {\n\t\tfmt.Println(filePath)\n\t\treturn nil\n\t})\n\n\t// find files with filters\n\tfsutil.FindInDir(\"./\", func(filePath string, de fs.DirEntry) error {\n\t\tfmt.Println(filePath)\n\t\treturn nil\n\t}, fsutil.ExcludeDotFile)\n}\n```\n\n\n\n### JSON Utils\n\n\u003e Package `github.com/gookit/goutil/jsonutil`\n\n```go\n// source at jsonutil/encoding.go\nfunc MustString(v any) string\nfunc Encode(v any) ([]byte, error)\nfunc EncodePretty(v any) ([]byte, error)\nfunc EncodeString(v any) (string, error)\nfunc EncodeToWriter(v any, w io.Writer) error\nfunc EncodeUnescapeHTML(v any) ([]byte, error)\nfunc Decode(bts []byte, ptr any) error\nfunc DecodeString(str string, ptr any) error\nfunc DecodeReader(r io.Reader, ptr any) error\nfunc DecodeFile(file string, ptr any) error\n// source at jsonutil/jsonutil.go\nfunc WriteFile(filePath string, data any) error\nfunc WritePretty(filePath string, data any) error\nfunc ReadFile(filePath string, v any) error\nfunc Pretty(v any) (string, error)\nfunc MustPretty(v any) string\nfunc Mapping(src, dst any) error\nfunc IsJSON(s string) bool\nfunc IsJSONFast(s string) bool\nfunc IsArray(s string) bool\nfunc IsObject(s string) bool\nfunc StripComments(src string) string\n```\n\n\n### Maputil\n\n\u003e Package `github.com/gookit/goutil/maputil`\n\n\u003cdetails\u003e\u003csummary\u003eClick to see functions 👈\u003c/summary\u003e\n\n```go\n// source at maputil/check.go\nfunc HasKey(mp, key any) (ok bool)\nfunc HasOneKey(mp any, keys ...any) (ok bool, key any)\nfunc HasAllKeys(mp any, keys ...any) (ok bool, noKey any)\n// source at maputil/convert.go\nfunc KeyToLower(src map[string]string) map[string]string\nfunc AnyToStrMap(src any) map[string]string\nfunc ToStringMap(src map[string]any) map[string]string\nfunc ToL2StringMap(groupsMap map[string]any) map[string]map[string]string\nfunc CombineToSMap(keys, values []string) SMap\nfunc CombineToMap[K comdef.SortedType, V any](keys []K, values []V) map[K]V\nfunc SliceToSMap(kvPairs ...string) map[string]string\nfunc SliceToMap(kvPairs ...any) map[string]any\nfunc SliceToTypeMap[T any](valFunc func(any) T, kvPairs ...any) map[string]T\nfunc ToAnyMap(mp any) map[string]any\nfunc TryAnyMap(mp any) (map[string]any, error)\nfunc HTTPQueryString(data map[string]any) string\nfunc StringsMapToAnyMap(ssMp map[string][]string) map[string]any\nfunc ToString(mp map[string]any) string\nfunc ToString2(mp any) string\nfunc FormatIndent(mp any, indent string) string\nfunc Flatten(mp map[string]any) map[string]any\nfunc FlatWithFunc(mp map[string]any, fn reflects.FlatFunc)\n// source at maputil/format.go\nfunc NewFormatter(mp any) *MapFormatter\n// source at maputil/get.go\nfunc DeepGet(mp map[string]any, path string) (val any)\nfunc QuietGet(mp map[string]any, path string) (val any)\nfunc GetFromAny(path string, data any) (val any, ok bool)\nfunc GetByPath(path string, mp map[string]any) (val any, ok bool)\nfunc GetByPathKeys(mp map[string]any, keys []string) (val any, ok bool)\nfunc Keys(mp any) (keys []string)\nfunc TypedKeys[K comdef.SimpleType, V any](mp map[K]V) (keys []K)\nfunc FirstKey[T any](mp map[string]T) string\nfunc Values(mp any) (values []any)\nfunc TypedValues[K comdef.SimpleType, V any](mp map[K]V) (values []V)\nfunc EachAnyMap(mp any, fn func(key string, val any))\nfunc EachTypedMap[K comdef.SimpleType, V any](mp map[K]V, fn func(key K, val V))\n// source at maputil/maputil.go\nfunc SimpleMerge(src, dst map[string]any) map[string]any\nfunc Merge1level(mps ...map[string]any) map[string]any\nfunc DeepMerge(src, dst map[string]any, deep int) map[string]any\nfunc MergeSMap(src, dst map[string]string, ignoreCase bool) map[string]string\nfunc MergeStrMap(src, dst map[string]string) map[string]string\nfunc AppendSMap(dst, src map[string]string) map[string]string\nfunc MergeStringMap(src, dst map[string]string, ignoreCase bool) map[string]string\nfunc MergeMultiSMap(mps ...map[string]string) map[string]string\nfunc MergeL2StrMap(mps ...map[string]map[string]string) map[string]map[string]string\nfunc FilterSMap(sm map[string]string) map[string]string\nfunc MakeByPath(path string, val any) (mp map[string]any)\nfunc MakeByKeys(keys []string, val any) (mp map[string]any)\n// source at maputil/setval.go\nfunc SetByPath(mp *map[string]any, path string, val any) error\nfunc SetByKeys(mp *map[string]any, keys []string, val any) (err error)\n```\n\u003c/details\u003e\n\n\n### Math/Number\n\n\u003e Package `github.com/gookit/goutil/mathutil`\n\nPackage `mathutil` provide math(int, number) util functions. eg: convert, math calc, random\n\n\u003cdetails\u003e\u003csummary\u003eClick to see functions 👈\u003c/summary\u003e\n\n```go\n// source at mathutil/calc.go\nfunc Abs[T comdef.Int](val T) T\n// source at mathutil/check.go\nfunc IsNumeric(c byte) bool\nfunc IsInteger(val any) bool\nfunc Compare(first, second any, op string) bool\nfunc CompInt[T comdef.Xint](first, second T, op string) (ok bool)\nfunc CompInt64(first, second int64, op string) bool\nfunc CompFloat[T comdef.Float](first, second T, op string) (ok bool)\nfunc CompValue[T comdef.Number](first, second T, op string) (ok bool)\nfunc InRange[T comdef.Number](val, min, max T) bool\nfunc OutRange[T comdef.Number](val, min, max T) bool\nfunc InUintRange[T comdef.Uint](val, min, max T) bool\n// source at mathutil/compare.go\nfunc Min[T comdef.Number](x, y T) T\nfunc Max[T comdef.Number](x, y T) T\nfunc SwapMin[T comdef.Number](x, y T) (T, T)\nfunc SwapMax[T comdef.Number](x, y T) (T, T)\nfunc MaxInt(x, y int) int\nfunc SwapMaxInt(x, y int) (int, int)\nfunc MaxI64(x, y int64) int64\nfunc SwapMaxI64(x, y int64) (int64, int64)\nfunc MaxFloat(x, y float64) float64\n// source at mathutil/conv2int.go\nfunc Int(in any) (int, error)\nfunc SafeInt(in any) int\nfunc QuietInt(in any) int\nfunc IntOrPanic(in any) int\nfunc MustInt(in any) int\nfunc IntOrDefault(in any, defVal int) int\nfunc IntOr(in any, defVal int) int\nfunc IntOrErr(in any) (int, error)\nfunc ToInt(in any) (int, error)\nfunc ToIntWith(in any, optFns ...ConvOptionFn[int]) (iVal int, err error)\nfunc Int64(in any) (int64, error)\nfunc SafeInt64(in any) int64\nfunc QuietInt64(in any) int64\nfunc MustInt64(in any) int64\nfunc Int64OrDefault(in any, defVal int64) int64\nfunc Int64Or(in any, defVal int64) int64\nfunc ToInt64(in any) (int64, error)\nfunc Int64OrErr(in any) (int64, error)\nfunc ToInt64With(in any, optFns ...ConvOptionFn[int64]) (i64 int64, err error)\nfunc Uint(in any) (uint, error)\nfunc SafeUint(in any) uint\nfunc QuietUint(in any) uint\nfunc MustUint(in any) uint\nfunc UintOrDefault(in any, defVal uint) uint\nfunc UintOr(in any, defVal uint) uint\nfunc UintOrErr(in any) (uint, error)\nfunc ToUint(in any) (u64 uint, err error)\nfunc ToUintWith(in any, optFns ...ConvOptionFn[uint]) (uVal uint, err error)\nfunc Uint64(in any) (uint64, error)\nfunc QuietUint64(in any) uint64\nfunc SafeUint64(in any) uint64\nfunc MustUint64(in any) uint64\nfunc Uint64OrDefault(in any, defVal uint64) uint64\nfunc Uint64Or(in any, defVal uint64) uint64\nfunc Uint64OrErr(in any) (uint64, error)\nfunc ToUint64(in any) (uint64, error)\nfunc ToUint64With(in any, optFns ...ConvOptionFn[uint64]) (u64 uint64, err error)\nfunc StrInt(s string) int\nfunc StrIntOr(s string, defVal int) int\nfunc TryStrInt(s string) (int, error)\nfunc TryStrInt64(s string) (int64, error)\nfunc TryStrUint64(s string) (uint64, error)\n// source at mathutil/convert.go\nfunc NewConvOption[T any](optFns ...ConvOptionFn[T]) *ConvOption[T]\nfunc WithNilAsFail[T any](opt *ConvOption[T])\nfunc WithHandlePtr[T any](opt *ConvOption[T])\nfunc WithStrictMode[T any](opt *ConvOption[T])\nfunc WithUserConvFn[T any](fn ToTypeFunc[T]) ConvOptionFn[T]\nfunc StrictInt(val any) (int64, bool)\nfunc StrictUint(val any) (uint64, bool)\nfunc QuietFloat(in any) float64\nfunc SafeFloat(in any) float64\nfunc FloatOrPanic(in any) float64\nfunc MustFloat(in any) float64\nfunc FloatOrDefault(in any, defVal float64) float64\nfunc FloatOr(in any, defVal float64) float64\nfunc Float(in any) (float64, error)\nfunc FloatOrErr(in any) (float64, error)\nfunc ToFloat(in any) (float64, error)\nfunc ToFloatWith(in any, optFns ...ConvOptionFn[float64]) (f64 float64, err error)\nfunc MustString(val any) string\nfunc StringOrPanic(val any) string\nfunc StringOrDefault(val any, defVal string) string\nfunc StringOr(val any, defVal string) string\nfunc ToString(val any) (string, error)\nfunc StringOrErr(val any) (string, error)\nfunc QuietString(val any) string\nfunc String(val any) string\nfunc SafeString(val any) string\nfunc TryToString(val any, defaultAsErr bool) (string, error)\nfunc ToStringWith(in any, optFns ...comfunc.ConvOptionFn) (string, error)\n// source at mathutil/format.go\nfunc DataSize(size uint64) string\nfunc FormatBytes(bytes int) string\nfunc HowLongAgo(sec int64) string\n// source at mathutil/mathutil.go\nfunc OrElse[T comdef.Number](val, defVal T) T\nfunc ZeroOr[T comdef.Number](val, defVal T) T\nfunc LessOr[T comdef.Number](val, max, devVal T) T\nfunc LteOr[T comdef.Number](val, max, devVal T) T\nfunc GreaterOr[T comdef.Number](val, min, defVal T) T\nfunc GteOr[T comdef.Number](val, min, defVal T) T\nfunc Mul[T1, T2 comdef.Number](a T1, b T2) float64\nfunc MulF2i(a, b float64) int\nfunc Div[T1, T2 comdef.Number](a T1, b T2) float64\nfunc DivInt[T comdef.Integer](a, b T) int\nfunc DivF2i(a, b float64) int\nfunc Percent(val, total int) float64\n// source at mathutil/random.go\nfunc RandomInt(min, max int) int\nfunc RandInt(min, max int) int\nfunc RandIntWithSeed(min, max int, seed int64) int\nfunc RandomIntWithSeed(min, max int, seed int64) int\n```\n\u003c/details\u003e\n\n\n### Reflects\n\n\u003e Package `github.com/gookit/goutil/reflects`\n\nPackage `reflects` Provide extends reflection util functions. eg: check, convert, value set, etc.\n\n\u003cdetails\u003e\u003csummary\u003eClick to see functions 👈\u003c/summary\u003e\n\n```go\n// source at reflects/check.go\nfunc IsTimeType(t reflect.Type) bool\nfunc IsDurationType(t reflect.Type) bool\nfunc HasChild(v reflect.Value) bool\nfunc IsArrayOrSlice(k reflect.Kind) bool\nfunc IsSimpleKind(k reflect.Kind) bool\nfunc IsAnyInt(k reflect.Kind) bool\nfunc IsIntLike(k reflect.Kind) bool\nfunc IsIntx(k reflect.Kind) bool\nfunc IsUintX(k reflect.Kind) bool\nfunc IsNil(v reflect.Value) bool\nfunc IsValidPtr(v reflect.Value) bool\nfunc CanBeNil(typ reflect.Type) bool\nfunc IsFunc(val any) bool\nfunc IsEqual(src, dst any) bool\nfunc IsEmpty(v reflect.Value) bool\nfunc IsEmptyReal(v reflect.Value) bool\n// source at reflects/conv.go\nfunc BaseTypeVal(v reflect.Value) (value any, err error)\nfunc ToBaseVal(v reflect.Value) (value any, err error)\nfunc ConvToType(val any, typ reflect.Type) (rv reflect.Value, err error)\nfunc ValueByType(val any, typ reflect.Type) (rv reflect.Value, err error)\nfunc ValueByKind(val any, kind reflect.Kind) (reflect.Value, error)\nfunc ConvToKind(val any, kind reflect.Kind, fallback ...ConvFunc) (rv reflect.Value, err error)\nfunc ConvSlice(oldSlRv reflect.Value, newElemTyp reflect.Type) (rv reflect.Value, err error)\nfunc String(rv reflect.Value) string\nfunc ToString(rv reflect.Value) (str string, err error)\nfunc ValToString(rv reflect.Value, defaultAsErr bool) (str string, err error)\nfunc ToTimeOrDuration(str string, typ reflect.Type) (any, error)\n// source at reflects/func.go\nfunc NewFunc(fn any) *FuncX\nfunc Call2(fn reflect.Value, args []reflect.Value) (reflect.Value, error)\nfunc Call(fn reflect.Value, args []reflect.Value, opt *CallOpt) ([]reflect.Value, error)\nfunc SafeCall2(fun reflect.Value, args []reflect.Value) (val reflect.Value, err error)\nfunc SafeCall(fun reflect.Value, args []reflect.Value) (ret []reflect.Value, err error)\n// source at reflects/map.go\nfunc TryAnyMap(mp reflect.Value) (map[string]any, error)\nfunc EachMap(mp reflect.Value, fn func(key, val reflect.Value)) (err error)\nfunc EachStrAnyMap(mp reflect.Value, fn func(key string, val any)) error\nfunc FlatMap(rv reflect.Value, fn FlatFunc)\n// source at reflects/slice.go\nfunc MakeSliceByElem(elTyp reflect.Type, len, cap int) reflect.Value\nfunc FlatSlice(sl reflect.Value, depth int) reflect.Value\n// source at reflects/type.go\nfunc ToBaseKind(kind reflect.Kind) BKind\nfunc ToBKind(kind reflect.Kind) BKind\nfunc TypeOf(v any) Type\n// source at reflects/util.go\nfunc Elem(v reflect.Value) reflect.Value\nfunc Indirect(v reflect.Value) reflect.Value\nfunc UnwrapAny(v reflect.Value) reflect.Value\nfunc TypeReal(t reflect.Type) reflect.Type\nfunc TypeElem(t reflect.Type) reflect.Type\nfunc Len(v reflect.Value) int\nfunc SliceSubKind(typ reflect.Type) reflect.Kind\nfunc SliceElemKind(typ reflect.Type) reflect.Kind\nfunc UnexportedValue(rv reflect.Value) any\nfunc SetUnexportedValue(rv reflect.Value, value any)\nfunc SetValue(rv reflect.Value, val any) error\nfunc SetRValue(rv, val reflect.Value)\n// source at reflects/value.go\nfunc Wrap(rv reflect.Value) Value\nfunc ValueOf(v any) Value\n```\n\u003c/details\u003e\n\n\n### Struct Utils\n\n\u003e Package `github.com/gookit/goutil/structs`\n\nPackage `structs` Provide some extends util functions for struct. eg: tag parse, struct init, value set/get\n\n\u003cdetails\u003e\u003csummary\u003eClick to see functions 👈\u003c/summary\u003e\n\n```go\n// source at structs/alias.go\nfunc NewAliases(checker func(alias string)) *Aliases\n// source at structs/convert.go\nfunc ToMap(st any, optFns ...MapOptFunc) map[string]any\nfunc MustToMap(st any, optFns ...MapOptFunc) map[string]any\nfunc TryToMap(st any, optFns ...MapOptFunc) (map[string]any, error)\nfunc ToSMap(st any, optFns ...MapOptFunc) map[string]string\nfunc TryToSMap(st any, optFns ...MapOptFunc) (map[string]string, error)\nfunc MustToSMap(st any, optFns ...MapOptFunc) map[string]string\nfunc ToString(st any, optFns ...MapOptFunc) string\nfunc WithMapTagName(tagName string) MapOptFunc\nfunc WithUserFunc(fn CustomUserFunc) MapOptFunc\nfunc MergeAnonymous(opt *MapOptions)\nfunc ExportPrivate(opt *MapOptions)\nfunc WithIgnoreEmpty(opt *MapOptions)\nfunc StructToMap(st any, optFns ...MapOptFunc) (map[string]any, error)\n// source at structs/copy.go\nfunc MapStruct(srcSt, dstSt any)\n// source at structs/data.go\nfunc NewLiteData(data map[string]any) *Data\nfunc NewData() *Data\nfunc NewOrderedData(cap int) *OrderedData\n// source at structs/init.go\nfunc Init(ptr any, optFns ...InitOptFunc) error\nfunc InitDefaults(ptr any, optFns ...InitOptFunc) error\n// source at structs/structs.go\nfunc IsExported(name string) bool\nfunc IsUnexported(name string) bool\n// source at structs/tags.go\nfunc ParseTags(st any, tagNames []string) (map[string]maputil.SMap, error)\nfunc ParseReflectTags(rt reflect.Type, tagNames []string) (map[string]maputil.SMap, error)\nfunc NewTagParser(tagNames ...string) *TagParser\nfunc ParseTagValueDefault(field, tagVal string) (mp maputil.SMap, err error)\nfunc ParseTagValueQuick(tagVal string, defines []string) maputil.SMap\nfunc ParseTagValueDefine(sep string, defines []string) TagValFunc\nfunc ParseTagValueNamed(field, tagVal string, keys ...string) (mp maputil.SMap, err error)\n// source at structs/value.go\nfunc NewValue(val any) *Value\n// source at structs/wrapper.go\nfunc Wrap(src any) *Wrapper\nfunc NewWrapper(src any) *Wrapper\nfunc WrapValue(rv reflect.Value) *Wrapper\n// source at structs/writer.go\nfunc NewWriter(ptr any) *Wrapper\nfunc WithParseDefault(opt *SetOptions)\nfunc WithBeforeSetFn(fn BeforeSetFunc) SetOptFunc\nfunc BindData(ptr any, data map[string]any, optFns ...SetOptFunc) error\nfunc SetValues(ptr any, data map[string]any, optFns ...SetOptFunc) error\n```\n\u003c/details\u003e\n\n\n### String Utils\n\n\u003e Package `github.com/gookit/goutil/strutil`\n\n\u003cdetails\u003e\u003csummary\u003eClick to see functions 👈\u003c/summary\u003e\n\n```go\n// source at strutil/bytes.go\nfunc NewBuffer(initSize ...int) *Buffer\nfunc NewByteChanPool(maxSize, width, capWidth int) *ByteChanPool\n// source at strutil/check.go\nfunc IsNumChar(c byte) bool\nfunc IsInt(s string) bool\nfunc IsUint(s string) bool\nfunc IsFloat(s string) bool\nfunc IsNumeric(s string) bool\nfunc IsPositiveNum(s string) bool\nfunc IsAlphabet(char uint8) bool\nfunc IsAlphaNum(c uint8) bool\nfunc IsUpper(s string) bool\nfunc IsLower(s string) bool\nfunc StrPos(s, sub string) int\nfunc BytePos(s string, bt byte) int\nfunc IEqual(s1, s2 string) bool\nfunc NoCaseEq(s, t string) bool\nfunc IContains(s, sub string) bool\nfunc ContainsByte(s string, c byte) bool\nfunc ContainsByteOne(s string, bs []byte) bool\nfunc ContainsOne(s string, subs []string) bool\nfunc HasOneSub(s string, subs []string) bool\nfunc IContainsOne(s string, subs []string) bool\nfunc ContainsAll(s string, subs []string) bool\nfunc HasAllSubs(s string, subs []string) bool\nfunc IContainsAll(s string, subs []string) bool\nfunc IsStartsOf(s string, prefixes []string) bool\nfunc HasOnePrefix(s string, prefixes []string) bool\nfunc HasPrefix(s string, prefix string) bool\nfunc IsStartOf(s, prefix string) bool\nfunc HasSuffix(s string, suffix string) bool\nfunc IsEndOf(s, suffix string) bool\nfunc HasOneSuffix(s string, suffixes []string) bool\nfunc IsValidUtf8(s string) bool\nfunc IsSpace(c byte) bool\nfunc IsEmpty(s string) bool\nfunc IsBlank(s string) bool\nfunc IsNotBlank(s string) bool\nfunc IsBlankBytes(bs []byte) bool\nfunc IsSymbol(r rune) bool\nfunc HasEmpty(ss ...string) bool\nfunc IsAllEmpty(ss ...string) bool\nfunc IsVersion(s string) bool\nfunc IsVarName(s string) bool\nfunc IsEnvName(s string) bool\nfunc Compare(s1, s2, op string) bool\nfunc VersionCompare(v1, v2, op string) bool\nfunc SimpleMatch(s string, keywords []string) bool\nfunc QuickMatch(pattern, s string) bool\nfunc PathMatch(pattern, s string) bool\nfunc GlobMatch(pattern, s string) bool\nfunc LikeMatch(pattern, s string) bool\nfunc MatchNodePath(pattern, s string, sep string) bool\n// source at strutil/convbase.go\nfunc Base10Conv(src string, to int) string\nfunc BaseConv(src string, from, to int) string\nfunc BaseConvInt(src uint64, to int) string\nfunc BaseConvByTpl(src string, fromBase, toBase string) string\nfunc BaseConvIntByTpl(dec uint64, toBase string) string\n// source at strutil/convert.go\nfunc Quote(s string) string\nfunc Unquote(s string) string\nfunc Join(sep string, ss ...string) string\nfunc JoinList(sep string, ss []string) string\nfunc JoinComma(ss []string) string\nfunc JoinAny(sep string, parts ...any) string\nfunc Implode(sep string, ss ...string) string\nfunc String(val any) (string, error)\nfunc ToString(val any) (string, error)\nfunc StringOrErr(val any) (string, error)\nfunc QuietString(val any) string\nfunc SafeString(in any) string\nfunc StringOrPanic(val any) string\nfunc MustString(val any) string\nfunc StringOrDefault(val any, defVal string) string\nfunc StringOr(val any, defVal string) string\nfunc AnyToString(val any, defaultAsErr bool) (s string, err error)\nfunc ToStringWith(in any, optFns ...comfunc.ConvOptionFn) (string, error)\nfunc ToBool(s string) (bool, error)\nfunc QuietBool(s string) bool\nfunc SafeBool(s string) bool\nfunc MustBool(s string) bool\nfunc Bool(s string) (bool, error)\nfunc Int(s string) (int, error)\nfunc ToInt(s string) (int, error)\nfunc IntOrDefault(s string, defVal int) int\nfunc IntOr(s string, defVal int) int\nfunc SafeInt(s string) int\nfunc QuietInt(s string) int\nfunc MustInt(s string) int\nfunc IntOrPanic(s string) int\nfunc Int64(s string) int64\nfunc QuietInt64(s string) int64\nfunc SafeInt64(s string) int64\nfunc ToInt64(s string) (int64, error)\nfunc Int64OrDefault(s string, defVal int64) int64\nfunc Int64Or(s string, defVal int64) int64\nfunc Int64OrErr(s string) (int64, error)\nfunc MustInt64(s string) int64\nfunc Int64OrPanic(s string) int64\nfunc Uint(s string) uint64\nfunc SafeUint(s string) uint64\nfunc ToUint(s string) (uint64, error)\nfunc UintOrErr(s string) (uint64, error)\nfunc MustUint(s string) uint64\nfunc UintOrPanic(s string) uint64\nfunc UintOrDefault(s string, defVal uint64) uint64\nfunc UintOr(s string, defVal uint64) uint64\nfunc Byte2str(b []byte) string\nfunc Byte2string(b []byte) string\nfunc ToBytes(s string) (b []byte)\nfunc Ints(s string, sep ...string) []int\nfunc ToInts(s string, sep ...string) ([]int, error)\nfunc ToIntSlice(s string, sep ...string) (ints []int, err error)\nfunc ToArray(s string, sep ...string) []string\nfunc Strings(s string, sep ...string) []string\nfunc ToStrings(s string, sep ...string) []string\nfunc ToSlice(s string, sep ...string) []string\nfunc ToDuration(s string) (time.Duration, error)\n// source at strutil/encode.go\nfunc EscapeJS(s string) string\nfunc EscapeHTML(s string) string\nfunc AddSlashes(s string) string\nfunc StripSlashes(s string) string\nfunc URLEncode(s string) string\nfunc URLDecode(s string) string\nfunc B32Encode(str string) string\nfunc B32Decode(str string) string\nfunc B64Encode(str string) string\nfunc B64EncodeBytes(src []byte) []byte\nfunc B64Decode(str string) string\nfunc B64DecodeBytes(str []byte) []byte\n// source at strutil/ext.go\nfunc NewComparator(src, dst string) *SimilarComparator\nfunc Similarity(s, t string, rate float32) (float32, bool)\n// source at strutil/filter.go\nfunc Trim(s string, cutSet ...string) string\nfunc Ltrim(s string, cutSet ...string) string\nfunc LTrim(s string, cutSet ...string) string\nfunc TrimLeft(s string, cutSet ...string) string\nfunc Rtrim(s string, cutSet ...string) string\nfunc RTrim(s string, cutSet ...string) string\nfunc TrimRight(s string, cutSet ...string) string\nfunc FilterEmail(s string) string\nfunc Filter(ss []string, fls ...comdef.StringMatchFunc) []string\n// source at strutil/format.go\nfunc Title(s string) string\nfunc Lower(s string) string\nfunc Lowercase(s string) string\nfunc Upper(s string) string\nfunc Uppercase(s string) string\nfunc UpperWord(s string) string\nfunc LowerFirst(s string) string\nfunc UpperFirst(s string) string\nfunc SnakeCase(s string, sep ...string) string\nfunc Camel(s string, sep ...string) string\nfunc CamelCase(s string, sep ...string) string\nfunc Indent(s, prefix string) string\nfunc IndentBytes(b, prefix []byte) []byte\nfunc Replaces(str string, pairs map[string]string) string\nfunc ReplaceVars(s string, vars map[string]string) string\nfunc NewReplacer(pairs map[string]string) *strings.Replacer\nfunc WrapTag(s, tag string) string\n// source at strutil/gensn.go\nfunc MicroTimeID() string\nfunc MicroTimeHexID() string\nfunc MTimeHexID() string\nfunc MTimeBase36() string\nfunc MTimeBaseID(toBase int) string\nfunc DatetimeNo(prefix string) string\nfunc DateSN(prefix string) string\nfunc DateSNv2(prefix string, extBase ...int) string\nfunc DateSNv3(prefix string, dateLen int, extBase ...int) string\n// source at strutil/hash.go\nfunc Md5(src any) string\nfunc MD5(src any) string\nfunc GenMd5(src any) string\nfunc Md5Simple(src any) string\nfunc Md5Base62(src any) string\nfunc Md5Bytes(src any) []byte\nfunc ShortMd5(src any) string\nfunc HashPasswd(pwd, key string) string\nfunc VerifyPasswd(pwdMAC, pwd, key string) bool\n// source at strutil/padding.go\nfunc Padding(s, pad string, length int, pos PosFlag) string\nfunc PadLeft(s, pad string, length int) string\nfunc PadRight(s, pad string, length int) string\nfunc Resize(s string, length int, align PosFlag) string\nfunc PadChars[T byte | rune](cs []T, pad T, length int, pos PosFlag) []T\nfunc PadBytes(bs []byte, pad byte, length int, pos PosFlag) []byte\nfunc PadBytesLeft(bs []byte, pad byte, length int) []byte\nfunc PadBytesRight(bs []byte, pad byte, length int) []byte\nfunc PadRunes(rs []rune, pad rune, length int, pos PosFlag) []rune\nfunc PadRunesLeft(rs []rune, pad rune, length int) []rune\nfunc PadRunesRight(rs []rune, pad rune, length int) []rune\nfunc Repeat(s string, times int) string\nfunc RepeatRune(char rune, times int) []rune\nfunc RepeatBytes(char byte, times int) []byte\nfunc RepeatChars[T byte | rune](char T, times int) []T\n// source at strutil/parse.go\nfunc NumVersion(s string) string\nfunc MustToTime(s string, layouts ...string) time.Time\nfunc ToTime(s string, layouts ...string) (t time.Time, err error)\nfunc ParseSizeRange(expr string, opt *ParseSizeOpt) (min, max uint64, err error)\nfunc SafeByteSize(sizeStr string) uint64\nfunc ToByteSize(sizeStr string) (uint64, error)\n// source at strutil/random.go\nfunc RandomChars(ln int) string\nfunc RandomCharsV2(ln int) string\nfunc RandomCharsV3(ln int) string\nfunc RandWithTpl(n int, letters string) string\nfunc RandomString(length int) (string, error)\nfunc RandomBytes(length int) ([]byte, error)\n// source at strutil/runes.go\nfunc RuneIsWord(c rune) bool\nfunc RuneIsLower(c rune) bool\nfunc RuneIsUpper(c rune) bool\nfunc RunePos(s string, ru rune) int\nfunc IsSpaceRune(r rune) bool\nfunc Utf8Len(s string) int\nfunc Utf8len(s string) int\nfunc RuneCount(s string) int\nfunc RuneWidth(r rune) int\nfunc TextWidth(s string) int\nfunc Utf8Width(s string) int\nfunc RunesWidth(rs []rune) (w int)\nfunc Truncate(s string, w int, tail string) string\nfunc TextTruncate(s string, w int, tail string) string\nfunc Utf8Truncate(s string, w int, tail string) string\nfunc Chunk[T ~string](s T, size int) []T\nfunc TextSplit(s string, w int) []string\nfunc Utf8Split(s string, w int) []string\nfunc TextWrap(s string, w int) string\nfunc WidthWrap(s string, w int) string\nfunc WordWrap(s string, w int) string\n// source at strutil/split.go\nfunc BeforeFirst(s, sep string) string\nfunc AfterFirst(s, sep string) string\nfunc BeforeLast(s, sep string) string\nfunc AfterLast(s, sep string) string\nfunc Cut(s, sep string) (before string, after string, found bool)\nfunc QuietCut(s, sep string) (before string, after string)\nfunc MustCut(s, sep string) (before string, after string)\nfunc TrimCut(s, sep string) (string, string)\nfunc SplitKV(s, sep string) (string, string)\nfunc SplitValid(s, sep string) (ss []string)\nfunc Split(s, sep string) (ss []string)\nfunc SplitNValid(s, sep string, n int) (ss []string)\nfunc SplitN(s, sep string, n int) (ss []string)\nfunc SplitTrimmed(s, sep string) (ss []string)\nfunc SplitNTrimmed(s, sep string, n int) (ss []string)\nfunc SplitByWhitespace(s string) []string\nfunc Substr(s string, pos, length int) string\nfunc SplitInlineComment(val string, strict ...bool) (string, string)\nfunc FirstLine(output string) string\n// source at strutil/strutil.go\nfunc OrCond(cond bool, s1, s2 string) string\nfunc BlankOr(val, defVal string) string\nfunc ZeroOr[T ~string](val, defVal T) T\nfunc ErrorOr(s string, err error, defVal string) string\nfunc OrElse(s, orVal string) string\nfunc OrElseNilSafe(s *string, orVal string) string\nfunc OrHandle(s string, fn comdef.StringHandleFunc) string\nfunc Valid(ss ...string) string\nfunc SubstrCount(s, substr string, params ...uint64) (int, error)\n```\n\u003c/details\u003e\n\n\n### System Utils\n\n\u003e Package `github.com/gookit/goutil/sysutil`\n\n\u003cdetails\u003e\u003csummary\u003eClick to see functions 👈\u003c/summary\u003e\n\n```go\n// source at sysutil/exec.go\nfunc NewCmd(bin string, args ...string) *cmdr.Cmd\nfunc FlushExec(bin string, args ...string) error\nfunc QuickExec(cmdLine string, workDir ...string) (string, error)\nfunc ExecLine(cmdLine string, workDir ...string) (string, error)\nfunc ExecCmd(binName string, args []string, workDir ...string) (string, error)\nfunc ShellExec(cmdLine string, shells ...string) (string, error)\n// source at sysutil/sysenv.go\nfunc IsMSys() bool\nfunc IsWSL() bool\nfunc IsConsole(out io.Writer) bool\nfunc IsTerminal(fd uintptr) bool\nfunc StdIsTerminal() bool\nfunc Hostname() string\nfunc CurrentShell(onlyName bool, fallbackShell ...string) string\nfunc HasShellEnv(shell string) bool\nfunc IsShellSpecialVar(c uint8) bool\nfunc FindExecutable(binName string) (string, error)\nfunc Executable(binName string) (string, error)\nfunc HasExecutable(binName string) bool\nfunc Getenv(name string, def ...string) string\nfunc Environ() map[string]string\nfunc EnvMapWith(newEnv map[string]string) map[string]string\nfunc EnvPaths() []string\nfunc ToEnvPATH(paths []string) string\nfunc SearchPath(keywords string, limit int, opts ...SearchPathOption) []string\n// source at sysutil/sysgo.go\nfunc GoVersion() string\nfunc ParseGoVersion(line string) (*GoInfo, error)\nfunc OsGoInfo() (*GoInfo, error)\nfunc CallersInfos(skip, num int, filters ...goinfo.CallerFilterFunc) []*CallerInfo\n// source at sysutil/sysutil.go\nfunc Workdir() string\nfunc BinDir() string\nfunc BinName() string\nfunc BinFile() string\nfunc Open(fileOrURL string) error\nfunc OpenBrowser(fileOrURL string) error\nfunc OpenFile(path string) error\n// source at sysutil/sysutil_linux.go\nfunc IsWin() bool\nfunc IsWindows() bool\nfunc IsMac() bool\nfunc IsDarwin() bool\nfunc IsLinux() bool\nfunc OpenURL(URL string) error\n// source at sysutil/sysutil_nonwin.go\nfunc Kill(pid int, signal syscall.Signal) error\nfunc ProcessExists(pid int) bool\n// source at sysutil/sysutil_unix.go\nfunc IsWin() bool\nfunc IsWindows() bool\nfunc IsMac() bool\nfunc IsDarwin() bool\nfunc IsLinux() bool\nfunc OpenURL(URL string) error\n// source at sysutil/user.go\nfunc MustFindUser(uname string) *user.User\nfunc LoginUser() *user.User\nfunc CurrentUser() *user.User\nfunc UHomeDir() string\nfunc UserHomeDir() string\nfunc HomeDir() string\nfunc UserDir(subPaths ...string) string\nfunc UserCacheDir(subPaths ...string) string\nfunc UserConfigDir(subPaths ...string) string\nfunc ExpandPath(path string) string\nfunc ExpandHome(path string) string\n// source at sysutil/user_nonwin.go\nfunc IsAdmin() bool\nfunc ChangeUserByName(newUname string) error\nfunc ChangeUserUidGid(newUID int, newGid int) error\nfunc ChangeUserUIDGid(newUID int, newGid int) (err error)\n```\n\u003c/details\u003e\n\n\n### Testing Utils\n\n\u003e Package `github.com/gookit/goutil/testutil`\n\n\u003cdetails\u003e\u003csummary\u003eClick to see functions 👈\u003c/summary\u003e\n\n```go\n// source at testutil/buffer.go\nfunc NewBuffer() *byteutil.Buffer\nfunc NewSafeBuffer() *SafeBuffer\n// source at testutil/envmock.go\nfunc MockEnvValue(key, val string, fn func(nv string))\nfunc MockEnvValues(kvMap map[string]string, fn func())\nfunc MockOsEnvByText(envText string, fn func())\nfunc SetOsEnvs(mp map[string]string) string\nfunc RemoveTmpEnvs(tmpKey string)\nfunc ClearOSEnv()\nfunc RevertOSEnv()\nfunc RunOnCleanEnv(runFn func())\nfunc MockOsEnv(mp map[string]string, fn func())\nfunc MockCleanOsEnv(mp map[string]string, fn func())\n// source at testutil/httpmock.go\nfunc NewHTTPRequest(method, path string, data *MD) *http.Request\nfunc MockRequest(h http.Handler, method, path string, data *MD) *httptest.ResponseRecorder\nfunc MockHttpServer() *EchoServer\nfunc TestMain(m *testing.M)\nfunc NewEchoServer() *EchoServer\nfunc BuildEchoReply(r *http.Request) *EchoReply\nfunc ParseRespToReply(w *http.Response) *EchoReply\nfunc ParseBodyToReply(bd io.ReadCloser) *EchoReply\n// source at testutil/testutil.go\nfunc DiscardStdout() error\nfunc ReadOutput() (s string)\nfunc RewriteStdout()\nfunc RestoreStdout(printData ...bool) (s string)\nfunc RewriteStderr()\nfunc RestoreStderr(printData ...bool) (s string)\nfunc SetTimeLocal(tl *time.Location)\nfunc SetTimeLocalUTC()\nfunc RestoreTimeLocal()\n// source at testutil/writer.go\nfunc NewTestWriter() *TestWriter\nfunc NewDirEnt(fPath string, isDir ...bool) *fakeobj.DirEntry\n```\n\u003c/details\u003e\n\n\n### Timex\n\n\u003e Package `github.com/gookit/goutil/timex`\n\nProvides an enhanced `time.Time` implementation, and add more commonly used functional methods.\n\n\u003cdetails\u003e\u003csummary\u003eClick to see functions 👈\u003c/summary\u003e\n\n```go\n// source at timex/check.go\nfunc IsDuration(s string) bool\nfunc InRange(dst, start, end time.Time) bool\n// source at timex/conv.go\nfunc Elapsed(start, end time.Time) string\nfunc ElapsedNow(start time.Time) string\nfunc FormatDuration(d time.Duration) string\nfunc FromNow(t time.Time) string\nfunc FromNowWith(u time.Time, tms []TimeMessage) string\nfunc HowLongAgo(diffSec int64) string\nfunc HowLongAgo2(diffSec int64, tms []TimeMessage) string\nfunc ToTime(s string, layouts ...string) (time.Time, error)\nfunc ToDur(s string) (time.Duration, error)\nfunc ParseDuration(s string) (time.Duration, error)\nfunc ToDuration(s string) (time.Duration, error)\nfunc TryToTime(s string, bt time.Time) (time.Time, error)\nfunc ParseRange(expr string, opt *ParseRangeOpt) (start, end time.Time, err error)\n// source at timex/gotime.go\nfunc SetLocalByName(tzName string) error\nfunc NowAddDay(day int) time.Time\nfunc NowAddHour(hour int) time.Time\nfunc NowAddMinutes(minutes int) time.Time\nfunc NowAddSec(seconds int) time.Time\nfunc NowAddSeconds(seconds int) time.Time\nfunc NowHourStart() time.Time\nfunc NowHourEnd() time.Time\nfunc AddDay(t time.Time, day int) time.Time\nfunc AddHour(t time.Time, hour int) time.Time\nfunc AddMinutes(t time.Time, minutes int) time.Time\nfunc AddSeconds(t time.Time, seconds int) time.Time\nfunc AddSec(t time.Time, seconds int) time.Time\nfunc HourStart(t time.Time) time.Time\nfunc HourEnd(t time.Time) time.Time\nfunc DayStart(t time.Time) time.Time\nfunc DayEnd(t time.Time) time.Time\nfunc TodayStart() time.Time\nfunc TodayEnd() time.Time\n// source at timex/template.go\nfunc ToLayout(template string) string\n// source at timex/timex.go\nfunc Now() *Time\nfunc New(t time.Time) *Time\nfunc Wrap(t time.Time) *Time\nfunc FromTime(t time.Time) *Time\nfunc Local() *Time\nfunc FromUnix(sec int64) *Time\nfunc FromDate(s string, template ...string) (*Time, error)\nfunc FromString(s string, layouts ...string) (*Time, error)\nfunc LocalByName(tzName string) *Time\n// source at timex/util.go\nfunc NowUnix() int64\nfunc NowDate(template ...string) string\nfunc Format(t time.Time) string\nfunc FormatBy(t time.Time, layout string) string\nfunc Date(t time.Time, template ...string) string\nfunc Datetime(t time.Time, template ...string) string\nfunc DateFormat(t time.Time, template string) string\nfunc FormatByTpl(t time.Time, template string) string\nfunc FormatUnix(sec int64, layout ...string) string\nfunc FormatUnixBy(sec int64, layout string) string\nfunc FormatUnixByTpl(sec int64, template ...string) string\n```\n\u003c/details\u003e\n\n#### Timex Usage\n\n**Create timex instance**\n\n```go\nnow := timex.Now()\n\n// from time.Time\ntx := timex.New(time.Now())\ntx := timex.FromTime(time.Now())\n\n// from time unix\ntx := timex.FromUnix(1647411580)\n```\n\nCreate from datetime string:\n\n```go\n// auto match layout by datetime\ntx, err  := timex.FromString(\"2022-04-20 19:40:34\")\n// custom set the datetime layout\ntx, err  := timex.FromString(\"2022-04-20 19:40:34\", \"2006-01-02 15:04:05\")\n// use date template as layout\ntx, err  := timex.FromDate(\"2022-04-20 19:40:34\", \"Y-m-d H:I:S\")\n```\n\n**Use timex instance**\n\n```go\ntx := timex.Now()\n```\n\nchange time:\n\n```go\ntx.Yesterday()\ntx.Tomorrow()\n\ntx.DayStart() // get time at Y-m-d 00:00:00\ntx.DayEnd() // get time at Y-m-d 23:59:59\ntx.HourStart() // get time at Y-m-d H:00:00\ntx.HourEnd() // get time at Y-m-d H:59:59\n\ntx.AddDay(2)\ntx.AddHour(1)\ntx.AddMinutes(15)\ntx.AddSeconds(120)\n```\n\ncompare time:\n\n```go\n// before compare\ntx.IsBefore(u time.Time)\ntx.IsBeforeUnix(1647411580)\n// after compare\ntx.IsAfter(u time.Time)\ntx.IsAfterUnix(1647411580)\n```\n\n**Helper functions**\n\n```go\nts := timex.NowUnix() // current unix timestamp\n\nt := NowAddDay(1) // from now add 1 day\nt := NowAddHour(1) // from now add 1 hour\nt := NowAddMinutes(3) // from now add 3 minutes\nt := NowAddSeconds(180) // from now add 180 seconds\n```\n\n**Convert time to date by template**\n\nTemplate Chars:\n\n```text\n Y,y - year\n  Y - year 2006\n  y - year 06\n m - month 01-12\n d - day 01-31\n H,h - hour\n  H - hour 00-23\n  h - hour 01-12\n I,i - minute\n  I - minute 00-59\n  i - minute 0-59\n S,s - second\n  S - second 00-59\n  s - second 0-59\n```\n\n\u003e More, please see [char map](./timex/template.go)\n\nExamples, use timex:\n\n```go\ntx := timex.Now()\ndate := tx.DateFormat(\"Y-m-d H:I:S\") // Output: 2022-04-20 19:09:03\ndate = tx.DateFormat(\"y-m-d h:i:s\") // Output: 22-04-20 07:9:3\n```\n\nFormat time.Time:\n\n```go\ntx := time.Now()\ndate := timex.DateFormat(tx, \"Y-m-d H:I:S\") // Output: 2022-04-20 19:40:34\n```\n\nMore usage:\n\n```go\nts := timex.NowUnix() // current unix timestamp\n\ndate := FormatUnix(ts, \"2006-01-02 15:04:05\") // Get: 2022-04-20 19:40:34\ndate := FormatUnixByTpl(ts, \"Y-m-d H:I:S\") // Get: 2022-04-20 19:40:34\n```\n\n\n\n## Code Check \u0026 Testing\n\n```bash\ngofmt -w -l ./\ngolint ./...\n\n# testing\ngo test -v ./...\ngo test -v -run ^TestErr$\ngo test -v -run ^TestErr$ ./testutil/assert/...\n```\n\nTesting in docker:\n\n```shell\ncd goutil\n\ndocker run -ti -v $(pwd):/go/goutil -e GOPROXY=https://goproxy.cn,direct golang:1.23\n# on Windows\ndocker run -ti -v \"${PWD}:/go/goutil\" -e GOPROXY=https://goproxy.cn,direct golang:1.23\n\nroot@xx:/go/goutil# go test ./...\n```\n\n## Gookit packages\n\n- [gookit/ini](https://github.com/gookit/ini) Go config management, use INI files\n- [gookit/rux](https://github.com/gookit/rux) Simple and fast request router for golang HTTP\n- [gookit/gcli](https://github.com/gookit/gcli) Build CLI application, tool library, running CLI commands\n- [gookit/slog](https://github.com/gookit/slog) Lightweight, easy to extend, configurable logging library written in Go\n- [gookit/color](https://github.com/gookit/color) A command-line color library with true color support, universal API methods and Windows support\n- [gookit/event](https://github.com/gookit/event) Lightweight event manager and dispatcher implements by Go\n- [gookit/cache](https://github.com/gookit/cache) Generic cache use and cache manager for golang. support File, Memory, Redis, Memcached.\n- [gookit/config](https://github.com/gookit/config) Go config management. support JSON, YAML, TOML, INI, HCL, ENV and Flags\n- [gookit/filter](https://github.com/gookit/filter) Provide filtering, sanitizing, and conversion of golang data\n- [gookit/validate](https://github.com/gookit/validate) Use for data validation and filtering. support Map, Struct, Form data\n- [gookit/goutil](https://github.com/gookit/goutil) Some utils for the Go: string, array/slice, map, format, cli, env, filesystem, test and more\n- More, please see https://github.com/gookit\n\n## Related\n\n- https://github.com/duke-git/lancet\n- https://github.com/samber/lo\n- https://github.com/zyedidia/generic\n- https://github.com/thoas/go-funk\n\n## License\n\n[MIT](LICENSE)\n","funding_links":[],"categories":["Programming","Go","Tool-kits \u0026 helpers"],"sub_categories":["Golang"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgookit%2Fgoutil","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgookit%2Fgoutil","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgookit%2Fgoutil/lists"}