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 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.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