gookit/goutil - 发布 v0.6.10 版本, Go 常用功能的扩展工具库 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
jxia
V2EX    Go 编程语言

gookit/goutil - 发布 v0.6.0 版本, Go 常用功能的扩展工具库

  •  
  •   jxia 2023-07-04 11:12:32 +08:00 1371 次点击
    这是一个创建于 835 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 格式的说明

    dump custom_type.png

    初始化结构体

    • 支持初始化使用环境变量
    • 支持初始化 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") // 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

    目前尚无回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1124 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 17:55 PVG 01:55 LAX 10:55 JFK 13:55
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86