gookit/goutil
Go 罕用性能的扩大工具库。蕴含:数字,字符串,slice/数组,Map,构造体,反射,文本,文件,谬误,工夫日期,测试,CLI,命令运行,零碎信息,格式化,罕用信息获取等等。
Github: https://github.com/gookit/goutil
v0.6.10 更新记录
残缺变更日志 v0.6.9...v0.6.10
✨ 新性能
- ✨ feat: testutil - 增加新的子包
fakeobj
以创立假对象用于测试 - ✨ feat: testutil - 增加新的函数
NewEchoServer()
来启动echo服务器 - ✨ feat: byteutil - Buffer 新增更多有用的办法,方便使用
- ✨ feat: dump - 非凡解决自定义的 int、uint 类型值,将会打印 String 格局的阐明
- ✨ feat: fsutil - 增加新的函数
Glob()
疾速列出匹配的文件 - ♻️ feat: httpreq - 重构内置的 http 客户端
httpreq
逻辑
更新调整
- up: structs - 更新
InitDefaults()
对不为空的构造体切片字段的初始化反对 - up: maputil -
SimpleMerge()
反对深度合并 map[string]any 数据
其余调整
- ✅ test: 更新一些文档并修复一些单元测试
- ⬆️ dep: 更新 golang.org/x 依赖到最新版本
局部新增性能应用
dump 打印自定义类型
dump 非凡解决自定义的 int、uint 类型值,将会打印 String 格局的阐明
初始化构造体
- 反对初始化应用环境变量
- 反对初始化 slice 字段,嵌套构造体
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 },},
应用 echo server 测试
应用 testutil.NewEchoServer()
能够疾速的创立一个HTTP echo server. 不便测试HTTP申请,响应等。
应用示例:
var testSrvAddr stringfunc 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.9 更新记录
残缺变更日志 v0.6.8...v0.6.9
✨ 新性能
- strutil - 新增
ToByteSize(),SafeByteSize()
用于将大小字符串(eg: 5MB)转换为字节大小 - strutil 新增
ParseSizeRange()
不便疾速的解析字符串大小范畴表达式 eg:200kb~50mb
- strutil - 增加新的工具函数:
DatetimeNo(),RandWithTpl(), SimpleMatch()
- byteutil - 增加新的工具函数:
Random()
,AppendAny()
- fsutil - 增加新的工具函数:
ReadOrErr()
,ReadStringOrErr()
- cliutil - 增加新的工具函数:
Confirm()
,ReadAsBool()
- errorx - 增加新的工具函数
Err(), Errf()
不便创立 error - structs -
InitDefaults()
加强,反对嵌套构造体指针初始化 - structs -
SetValues()
加强,反对设置解决构造体指针值 - structs - 新增
ToSMap(), TryToSMap(), TryToSMap()
转换构造体为string map - testutil/assert 新增断言办法
NotContainsKey()
,NotContainsKeys()
- reflects 新增工具办法
UnexportedValue()
,SetUnexportedValue()
- maputil 新增工具函数
HasOneKey(), CombineToMap(), TryAnyMap()
- arrutil 新增工具函数
AnyToSlice(), CombineToMap()
- jsonutil 新增工具办法
IsJSON(), IsJSONFast()
查看是否是JSON - ♻️ fsutil/finder 文件、目录查找重构,性能加强,应用更加不便
- timex 新增工具函数
NowAddSec(), IsDuration(), InRange()
- timex
ToDuration()
加强,反对单位 d,w 和长单位 hour、min、sec - mathutil 新增工具办法
InRange()
,OutRange()
,InUintRange()
- fsutil 新增工具办法
RemoveSub()
疾速删除子目录和文件 - maputil
GetByPath()
加强,反对相似top.*.field
匹配门路获取值
更新调整
- strutil 优化
ToByteSize()
和GlobMatch()
逻辑 - struts - InitDefaults() 反对初始化非零 ptr 子结构字段
- struts - InitDefaults() 要初始化子结构字段必须带有
default:""
其余调整
- 文档:README 文档更新,一些子包增加 README
- ✅ test: 新增并修复一些单元测试
- ⬆️ dep: 更新 golang.org/x 依赖到最新版本
局部性能应用示例
finder 文件查找应用
fsutil/finder
提供了简略疾速的形式查找匹配文件、目录。
- 内置反对 名称、扩大、后缀、前缀、glob、path 等蕴含或排除
- 反对匹配 文件大小,批改工夫(ModTime)等扩大匹配形式
ff := finder.NewFinder("/path/to/dir/"). // OnlyFindDir(). // 默认只只查找文件 UseAbsPath(). WithoutDotDir(). WithDirName("testdata"). Include(finder.HumanModTime("<10m")). // 最近10分钟有变动的 Include(finder.HumanSize("500kb~10mb")) // 限度文件大小// Find() 返回chan, 能够 for 解决查找后果for el := range f.Find() { fmt.Println(el.Path())}
strutil.ParseSizeRange
能够简略不便的将字符串大小范畴解析为 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()
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 以及相干办法的单元测试
Github: https://github.com/gookit/goutil