编程日记:分享开源库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(), "")
}

总结

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

相关推荐
初晴~7 分钟前
【Redis分布式锁】高并发场景下秒杀业务的实现思路(集群模式)
java·数据库·redis·分布式·后端·spring·
盖世英雄酱5813612 分钟前
InnoDB 的页分裂和页合并
数据库·后端
小_太_阳32 分钟前
Scala_【2】变量和数据类型
开发语言·后端·scala·intellij-idea
直裾35 分钟前
scala借阅图书保存记录(三)
开发语言·后端·scala
星就前端叭1 小时前
【开源】一款基于Vue3 + WebRTC + Node + SRS + FFmpeg搭建的直播间项目
前端·后端·开源·webrtc
小林coding2 小时前
阿里云 Java 后端一面,什么难度?
java·后端·mysql·spring·阿里云
AI理性派思考者2 小时前
【保姆教程】手把手教你在Linux系统搭建早期alpha项目cysic的验证者&证明者
后端·github·gpu
从善若水3 小时前
【2024】Merry Christmas!一起用Rust绘制一颗圣诞树吧
开发语言·后端·rust
机器之心3 小时前
终于等来能塞进手机的文生图模型!十分之一体量,SnapGen实现百分百的效果
人工智能·后端
机器之心3 小时前
首次!大模型自动搜索人工生命,做出AI科学家的Sakana AI又放大招
人工智能·后端