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