gookit/goutil
Go 常用功能的扩展工具库。包含:数字,字符串,slice/数组,Map ,结构体,反射,文本,文件,错误,时间日期,测试,CLI ,命令运行,系统信息,格式化,常用信息获取等等。
Github: https://github.com/gookit/goutil
完整变更日志 v0.6.9...v0.6.10
fakeobj
以创建假对象用于测试NewEchoServer()
来启动 echo 服务器Glob()
快速列出匹配的文件httpreq
逻辑InitDefaults()
对不为空的结构体切片字段的初始化支持SimpleMerge()
支持深度合并 map[string]any 数据dump 特殊处理自定义的 int 、uint 类型值,将会打印 String 格式的说明
type ExtraDefault struct { City string `default:"some where"` Github string `default:"${ GITHUB_ADDR }"` } type User struct { Name string `default:"inhere"` Age int `default:"300"` Extra *ExtraDefault `default:""` // 标记需要初始化 } optFn := func(opt *structs.InitOptions) { opt.ParseEnv = true } obj := &User{} err := structs.InitDefaults(obj, optFn) goutil.PanicErr(err) dump.P(obj)
初始化结果:
&structs_test.User { Name: string("inhere"), #len=6 Age: int(300), Extra: &structs_test.ExtraDefault { City: string("some where"), #len=10 Github: string("https://some .... url"), #len=21 }, },
使用 testutil.NewEchoServer()
可以快速的创建一个 HTTP echo server. 方便测试 HTTP 请求,响应等。
使用示例:
var testSrvAddr string func TestMain(m *testing.M) { s := testutil.NewEchoServer() defer s.Close() testSrvAddr = "http://" + s.Listener.Addr().String() fmt.Println("server addr:", testSrvAddr) m.Run() } func TestNewEchoServer(t *testing.T) { // 可直接请求测试 server r, err := http.Post(testSrvAddr, "text/plain", strings.NewReader("hello!")) assert.NoErr(t, err) // 将响应信息绑定到 testutil.EchoReply rr := testutil.ParseRespToReply(r) dump.P(rr) assert.Eq(t, "POST", rr.Method) assert.Eq(t, "text/plain", rr.ContentType()) assert.Eq(t, "hello!", rr.Body) }
完整变更日志 v0.6.8...v0.6.9
ToByteSize(),SafeByteSize()
用于将大小字符串(eg: 5MB)转换为字节大小ParseSizeRange()
方便快速的解析字符串大小范围表达式 eg:200kb~50mb
DatetimeNo(),RandWithTpl(), SimpleMatch()
Random()
, AppendAny()
ReadOrErr()
, ReadStringOrErr()
Confirm()
, ReadAsBool()
Err(), Errf()
方便创建 errorInitDefaults()
增强,支持嵌套结构体指针初始化SetValues()
增强,支持设置处理结构体指针值ToSMap(), TryToSMap(), TryToSMap()
转换结构体为 string mapNotContainsKey()
, NotContainsKeys()
UnexportedValue()
, SetUnexportedValue()
HasOneKey(), CombineToMap(), TryAnyMap()
AnyToSlice(), CombineToMap()
IsJSON(), IsJSONFast()
检查是否是 JSONNowAddSec(), IsDuration(), InRange()
ToDuration()
增强,支持单位 d ,w 和长单位 hour 、min 、secInRange()
, OutRange()
, InUintRange()
RemoveSub()
快速删除子目录和文件GetByPath()
增强,支持类似 top.*.field
匹配路径获取值ToByteSize()
和 GlobMatch()
逻辑default:""
fsutil/finder
提供了简单快速的方式查找匹配文件、目录。
ff := finder.NewFinder("/path/to/dir/"). // OnlyFindDir(). // 默认只只查找文件 UseAbsPath(). WithoutDotDir(). WithDirName("testdata") // Find() 返回 chan, 可以 for 处理查找结果 for el := range f.Find() { fmt.Println(el.Path()) }
可以简单方便的将字符串大小范围解析为 byte size
opt := &strutil.ParseSizeOpt{} mix, max, err := strutil.ParseSizeRange("1kb~1mb", opt) goutil.PanicErr(err) fmt.Println(min, max) // OUTPUT: 1024, 1048576
支持的表达式格式示例:
"1KB~2MB" => 1KB to 2MB "-1KB" => <1KB "~1MB" => <1MB "< 1KB" => <1KB "1KB" => >1KB "1KB~" => >1KB ">1KB" => >1KB "+1KB" => >1KB
timex.ParseRange()
可以简单快速的将相对的时间大小范围、或关键字解析为 time.Time
start, end, err := ParseRange("-1h~1h", nil) goutil.PanicErr(err) fmt.Println(start, end)
支持的表达式格式示例:
"-5h~-1h" => 5 hours ago to 1 hour ago "1h~5h" => 1 hour after to 5 hours after "-1h~1h" => 1 hour ago to 1 hour after "-1h" => 1 hour ago to feature. eq "-1h~" "-1h~0" => 1 hour ago to now. "< -1h" OR "~-1h" => 1 hour ago. "> 1h" OR "1h" => 1 hour after to feature // keyword: now, today, yesterday, tomorrow "today" => today start to today end "yesterday" => yesterday start to yesterday end "tomorrow" => tomorrow start to tomorrow end
更多使用说明请看 README 以及相关方法的单元测试