推荐一位高产的 Go 开源库作者
共 3828字,需浏览 8分钟
·
2021-05-23 00:46
阅读本文大概需要 4 分钟。
大家好,我是 polarisxu。
今天给大家推荐一位高产的 Go 开源库作者,他就是 Josh Baker,GitHub:https://github.com/tidwall,有些人应该不陌生吧?没见过,那这个库见过吗?gjson。如果还没见过,我只能说你弱爆了~
我给大家介绍下他的几个核心开源库。
01 gjson
这是快速的 JSON 解析库。如果你只是想从 JSON 中获取值,特别是复杂 JSON,定义结构体解析麻烦,gjson 绝对值得一试。
比如这样的一个 JSON 字符串:
{
"name": {"first": "Tom", "last": "Anderson"},
"age":37,
"children": ["Sara","Alex","Jack"],
"fav.movie": "Deer Hunter",
"friends": [
{"first": "Dale", "last": "Murphy", "age": 44, "nets": ["ig", "fb", "tw"]},
{"first": "Roger", "last": "Craig", "age": 68, "nets": ["fb", "tw"]},
{"first": "Jane", "last": "Murphy", "age": 47, "nets": ["ig", "tw"]}
]
}
现在有这样的需求:
获取 name 的 last 值? 获取 children 的数量? 获取第二个 children? 获取所有 friends 的 first 值? 获取第二个 friends 的 last 值? 获取 friends 中 last 为 Murphy 的 first 值? 。。。
面对上面的需求,你怎么处理?
gjson 通过 Path 语法可以快速解决上面的需求。
const str = `{
"name": {"first": "Tom", "last": "Anderson"},
"age":37,
"children": ["Sara","Alex","Jack"],
"fav.movie": "Deer Hunter",
"friends": [
{"first": "Dale", "last": "Murphy", "age": 44, "nets": ["ig", "fb", "tw"]},
{"first": "Roger", "last": "Craig", "age": 68, "nets": ["fb", "tw"]},
{"first": "Jane", "last": "Murphy", "age": 47, "nets": ["ig", "tw"]}
]
}`
func main() {
result := gjson.Parse(str)
// 获取 name 的 last 值?
fmt.Println("name.last =", result.Get("name.last").String())
// 获取 children 的数量?
fmt.Println("children.# =", result.Get("children.#").Int())
// 获取第二个 children?
fmt.Println("children.1 =", result.Get("children.1").String())
// 获取所有 friends 的 first 值?
fmt.Println("friends.#.first =", result.Get("friends.#.first").Array())
// 获取第二个 friends 的 last 值?
fmt.Println("friends.1.last =", result.Get("friends.1.last").String())
// 获取 friends 中 last 为 Murphy 的 first 值?
fmt.Println(`friends.#(last=="Murphy").first =`, result.Get(`friends.#(last=="Murphy").first`).String())
}
是不是超级方便?!甚至可以方便找到 friends 中 age 大于多少的人。这里可以直接运行测试:https://play.studygolang.com/p/lXFIfNJjuZ5。
项目地址:https://github.com/tidwall/gjson。
02 sjson
从名字可以看出来,gjson 是 get json,而 sjson 就是 set json 了。不过这个库的使用场景会比较少些。
项目地址:https://github.com/tidwall/sjson。
03 tile38
这是一个实时的地理空间和地理位置库。作者还专门创建了一个网站:https://tile38.com/。
04 evio
这是一个时间循环网络框架。有别于 Go 中常规的网络框架,这个框架基于事件。它直接使用 epoll 和 kqueue 系统调用而不是使用标准的 go net 包。因此,这个库和 C 语言的 libuv 和 libevent 类似。
项目地址:https://github.com/tidwall/evio。
05 buntdb
buntdb 是一个嵌入式内存的 Key/Value 数据库,用于定制索引和地理空间支持。
项目地址:https://github.com/tidwall/buntdb。
06 小结
除了以上列举的库,还有很多其他库。目前看一共有 130+ 个,其中 9 个 star 数超过 1k。该作者所有项目:https://github.com/tidwall?tab=repositories&q=&type=source&language=&sort=stargazers。
大家在 GitHub 上可以多 follow 一些高产的作者,发现好项目。
推广下我自己:欢迎在 GitHub 上 follow 我,我每周都会 star 不少 Go 的好项目,follow 我可以看到我的动态。阅读原文就可以直达我的 GitHub 主页:https://github.com/polaris1119。
我是 polarisxu,北大硕士毕业,曾在 360 等知名互联网公司工作,10多年技术研发与架构经验!2012 年接触 Go 语言并创建了 Go 语言中文网!著有《Go语言编程之旅》、开源图书《Go语言标准库》等。
坚持输出技术(包括 Go、Rust 等技术)、职场心得和创业感悟!欢迎关注「polarisxu」一起成长!也欢迎加我微信好友交流:gopherstudio