gookit/goutilâ-发布的v0.6.10,一个公共go的扩展库
#编程 #开源 #go #util

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类型值,将以字符串格式打印说明

dump custom_type.png

初始化结构

  • 支持初始化环境变量的使用
  • 支持初始化切片字段和嵌套结构
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