编程日记:分享开源库go-pretty

背景

我注意到一些开源的database 存储引擎项目代码里,在每一个存储在磁盘里的entity都会有类似这样的注释,表明这个对象在磁盘里的存储格式是什么样子的,而encode函数就是将这个对象加工成注释上的格式对应的二进制数组。

之前我在做一个东西的时候给项目引入了新的存储对象,当时想把这个注释加上,但是没有想到有什么好的办法可以帮我生成这个东西。所以就放弃了,先粗略写一个上去。

最近工作中需要优化一个服务的CDN成本,然后在aws上下载图片使用情况的报表自己分析的时候,我需要对这个aws报表上的数据分析加工一顿之后输出一些我想要的数据。这里也需要一个类似上面那个问题的东西,就是一个相对成熟的可以打印出来表格的成熟的框架或者开源库什么的。那么既然这个问题遇到两次了,没准别人或者我之后也会遇到相同的问题,那就投入点时间去解决解决吧。一顿搜索和询问gpt之后,发现了这个开源库,也就是今天要介绍的主角。go-pretty。

go-pretty

PS:其实这个部分就是简单的翻译了一下这个项目的readme并且加入了点自己的看法。给大家介绍介绍这个项目有什么功能,能做到什么事情。go-pretty (github.com/jedib0t/go-...) 可以用与在控制台上输出列表,表格,进度条,文本,等等,重点是在构建这些东西的过程中可以给用户提供很强大的定制化能力。

table

在终端中可以输出带有颜色的以及嵌套的表格。下面这个是readme中提到的例子,其实这个格式的表格已经符合我的需求了。

因为这个demo和我的用例有关,所以我把上面这个表格的代码贴出来,这样如果读者朋友们有相同的case可以直接参考这段代码 (看的出来这个库的作者很喜欢权游。。):

erlang 复制代码
package main
​
import (
    "os"
​
    "github.com/jedib0t/go-pretty/v6/table"
)
​
func main() {
    t := table.NewWriter()
    t.SetOutputMirror(os.Stdout)
    t.AppendHeader(table.Row{"#", "First Name", "Last Name", "Salary"})
    t.AppendRows([]table.Row{
        {1, "Arya", "Stark", 3000},
        {20, "Jon", "Snow", 2000, "You know nothing, Jon Snow!"},
    })
    t.AppendSeparator()
    t.AppendRow([]interface{}{300, "Tyrion", "Lannister", 5000})
    t.AppendFooter(table.Row{"", "", "Total", 10000})
    t.Render()
}

带有颜色的表格,如果想实现一个的终端工具,这会是一个能给你提供帮助的好工具。

table的详细文档:github.com/jedib0t/go-...

progress 和 List

最炫酷的当属是这个进度条功能了。而这个demo的代码太长了,我就不贴出来了,感兴趣的小伙伴可以看这里:github.com/jedib0t/go-...

另外,list可以输出多个层级的列表。

demo code:

go 复制代码
func main() {
    l := list.NewWriter()
    l.AppendItem("Game Of Thrones")
    l.Indent()
    l.AppendItems([]interface{}{"Winter", "Is", "Coming"})
    l.Indent()
    l.AppendItems([]interface{}{"This", "Is", "Known"})
    l.UnIndent()
    l.UnIndent()
    l.AppendItem("The Dark Tower")
    l.Indent()
    l.AppendItem("The Gunslinger")
    demoPrint("A Multi-level List", l.Render(), "")
}

总结

我觉得这个库对于想做终端工具的同学来说会是一大助力,另外一个用途就是我在文章开头提到的两个例子,想要输出一些简单的结构化数据,这个也会是一个很好的工具。好了今天的分享就到这里啦。希望这个库会对你有帮助。

相关推荐
GoldenaArcher5 分钟前
GraphQL 工程化篇 III:引入 Prisma 与数据库接入
数据库·后端·graphql
沐雨橙风ιε15 分钟前
Spring Boot整合Apache Shiro权限认证框架(实战篇)
java·spring boot·后端·apache shiro
struggle202520 分钟前
AxonHub 开源程序是一个现代 AI 网关系统,提供统一的 OpenAI、Anthropic 和 AI SDK 兼容 API
css·人工智能·typescript·go·shell·powershell
桦说编程26 分钟前
CompletableFuture 异常处理常见陷阱——非预期的同步异常
后端·性能优化·函数式编程
李广坤37 分钟前
Springboot解决跨域的五种方式
后端
赴前尘39 分钟前
Go 通道非阻塞发送:优雅地处理“通道已满”的场景
开发语言·后端·golang
cxyxiaokui0011 小时前
🔥不止于三级缓存:Spring循环依赖的全面解决方案
java·后端·spring
一线大码1 小时前
开发 Java 项目时的命名规范
java·spring boot·后端
neoooo1 小时前
Apollo兜底口诀
java·后端·架构
程序员小假1 小时前
什么是线程池?它的工作原理?
java·后端