gookit/goutil
GO的共同功能的扩展库。包含:数字,字符串,切片/阵列,地图,结构,反射,文本,文件,错误,时间和日期,测试,CLI,命令运行,系统信息,格式,格式化,常见信息获取等。
github :https://github.com/gookit/goutil
V0.6.10更改日志
完整的changelog v0.6.9...v0.6.10
- 新功能
- â€壮举:testutil-添加了一个新的儿童软件包
fakeobj
来创建用于测试的假对象 - â€壮举:testutil-添加了一个新函数newechoserver()启动Echo Server
- - 壮举:Byteutil-缓冲区添加了更有用的方法,以便于使用
- - 壮举:转储 - 自定义INT,UINT类型值的特殊处理,将以字符串格式打印说明
- - feat:fsutil-向glob()添加一个新函数,迅速列出匹配文件
- - »!feat:httpreq-重构内置的HTTP客户端httpreq逻辑
ð更新调整
- ðup:structs-更新和支持Initdefaults(),用于null null的结构切片字段
- ðup:maputil -
SimpleMerge()
支持地图的深入合并[字符串]任何数据
其他调整
- 测试:更新一些文档并修复了一些单元测试
- âtep:更新golang.org/x取决于最新版本
一些功能用法示例
转储 - 打印自定义类型
转储 - 特殊处理自定义INT,UINT类型值,将以字符串格式打印说明
初始化结构
- 支持初始化环境变量的使用
- 支持初始化切片字段和嵌套结构
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:""` // mark: need init
}
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服务器测试
使用testutil.NewEchoServer()
快速创建HTTP Echo服务器。方便测试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) {
// can direct request the echo server
r, err := http.Post(testSrvAddr, "text/plain", strings.NewReader("hello!"))
assert.NoErr(t, err)
// binding response to the 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更改日志
完整的changelog v0.6.8...v0.6.9
- 新功能
- strutil-添加了用于将大小字符串(例如:5MB)转换为字节大小的
ToByteSize(),SafeByteSize()
- strutil添加了
ParseSizeRange()
,以促进并快速解析弦尺寸范围表达式,例如:200kb~50mb
- strutil-添加了新的实用程序功能:
DatetimeNo(), RandWithTpl(), SimpleMatch()
- byteutil-添加新的实用程序功能:
Random()
,AppendAny()
- fsutil-添加新实用程序功能:
ReadOrErr()
,ReadStringOrErr()
11 - cliutil-添加新实用程序功能:
Confirm()
,ReadAsBool()
- errorx-添加新实用程序功能
Err(), Errf()
,以便于创建错误 - structs -
InitDefaults()
增强以支持嵌套结构指针初始化 - structs -
SetValues()
增强以支持设置和处理结构指针值 - structs-添加
ToSMap(), TryToSMap(), TryToSMap()
以将结构转换为字符串地图 - testutil/断言新的断言方法
NotContainsKey()
,NotContainsKeys()
- 反映新的实用方法
UnexportedValue()
,SetUnexportedValue()
- maputil新工具函数
HasOneKey(), CombineToMap(), TryAnyMap()
- 在Arrutil中添加了实用程序
AnyToSlice(), CombineToMap()
- jsonutil添加了工具方法
IsJSON(), IsJSONFast()
来检查它是否是json - â»âfsutil/finder文件和目录搜索重建,增强功能,更方便使用
- timex新实用程序
NowAddSec(), IsDuration(), InRange()
- timex
ToDuration()
增强,支撑单元D,W和长单位小时,最小,sec - Mathutil新工具方法
InRange()
,OutRange()
,InUintRange()
- fsutil新工具方法
RemoveSub()
快速删除子目录和文件 - MAPUTIL
GetByPath()
的增强以支持类似于top.*.field
的匹配路径以获取值
ð更新调整
- strutil优化
ToByteSize()
和GlobMatch()
逻辑 - Struts -
InitDefaults()
支持初始化非零PTR子结构字段 - ð¥struts -
InitDefaults()
要初始化子结构,必须用default:""
标记字段
其他调整
- ðdoc:更新了读书文档,一些子弹添加了readme
- 测试:添加并修复了一些单元测试
- â€tep:更新golang.org/x依赖关系到最新版本
一些功能用法示例
查找器 - 查找文件或DIR
fsutil/finder
提供了一种简单而快速的方法来查找匹配的文件和目录。
- 内置的支持名称,扩展名,后缀,前缀,环球,路径等。包括或排除
- 支持匹配文件大小,修改时间(Modtime)和其他扩展匹配方法
ff := finder.NewFinder("/path/to/dir/").
// OnlyFindDir(). // default find files
UseAbsPath().
WithoutDotDir().
WithDirName("testdata").
Include(finder.HumanModTime("<10m")). // latest 10 minutes, to Now
Include(finder.HumanSize("500kb~10mb")) // limit file size
// Find() returns chan, can be for handling
for el := range f.Find() {
fmt.Println(el.Path())
}
strutil.parsesizerange
很容易将字符串尺寸范围解析为字节大小。
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