golang实时更新终端输出的插件库uilive的使用
golang实时更新终端输出的插件库uilive的使用
uilive是一个用于实时更新终端输出的Go语言库。它提供了一个带缓冲的io.Writer,可以定时刷新输出内容。uilive是uiprogress库的基础组件。
安装方法
$ go get -v github.com/gosuri/uilive
使用示例
以下是一个完整的示例代码,展示了如何使用uilive库在终端实时更新输出:
package main
import (
"fmt"
"time"
"github.com/gosuri/uilive"
)
func main() {
// 创建一个新的writer实例
writer := uilive.New()
// 开始监听更新并渲染
writer.Start()
// 模拟下载进度更新
for i := 0; i <= 100; i++ {
// 向writer写入内容,这些内容会实时显示在终端
fmt.Fprintf(writer, "Downloading.. (%d/%d) GB\n", i, 100)
time.Sleep(time.Millisecond * 5)
}
// 写入最终完成信息
fmt.Fprintln(writer, "Finished: Downloaded 100GB")
// 刷新并停止渲染
writer.Stop()
}
代码说明
uilive.New()
创建一个新的writer实例writer.Start()
开始监听更新并渲染输出- 使用
fmt.Fprintf(writer, ...)
或fmt.Fprintln(writer, ...)
向终端写入内容 writer.Stop()
停止渲染并刷新最后的输出
这个示例会模拟一个下载进度条,在终端实时更新下载进度,从0%到100%,最后显示完成信息。
效果展示
运行上述代码会在终端显示一个动态更新的进度信息,效果类似于:
Downloading.. (50/100) GB
其中数字会不断更新,直到完成。
更多关于golang实时更新终端输出的插件库uilive的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang实时更新终端输出的插件库uilive的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用uilive实现Golang终端实时输出更新
uilive是一个轻量级的Go库,用于在终端中实现实时更新的输出效果。它非常适合需要显示进度、状态更新或任何需要动态刷新终端内容的场景。
基本使用
首先安装uilive库:
go get github.com/gosuri/uilive
简单示例
package main
import (
"fmt"
"time"
"github.com/gosuri/uilive"
)
func main() {
writer := uilive.New()
// 启动writer
writer.Start()
defer writer.Stop() // 确保程序退出时停止writer
for i := 0; i <= 100; i++ {
// 使用Fprintln向writer写入内容
fmt.Fprintf(writer, "下载进度: %d%%\n", i)
time.Sleep(time.Millisecond * 50)
}
fmt.Fprintln(writer, "下载完成!")
}
高级功能
多行输出
uilive支持同时更新多行内容:
func main() {
writer := uilive.New()
writer.Start()
defer writer.Stop()
// 第一行
fmt.Fprintf(writer.Bypass(), "这是静态标题\n")
// 动态更新的内容
for i := 0; i <= 100; i++ {
fmt.Fprintf(writer, "进度条1: %d%%\n", i)
fmt.Fprintf(writer, "进度条2: %d%%\n", 100-i)
time.Sleep(time.Millisecond * 50)
}
}
自定义刷新间隔
默认刷新间隔是10ms,可以调整:
writer := uilive.New()
writer.RefreshInterval = time.Millisecond * 100 // 设置为100ms刷新一次
带颜色的输出
可以结合其他颜色库如fatih/color
使用:
import "github.com/fatih/color"
func main() {
writer := uilive.New()
writer.Start()
defer writer.Stop()
red := color.New(color.FgRed).SprintFunc()
green := color.New(color.FgGreen).SprintFunc()
for i := 0; i <= 100; i++ {
if i < 50 {
fmt.Fprintf(writer, "状态: %s\n", red("警告"))
} else {
fmt.Fprintf(writer, "状态: %s\n", green("正常"))
}
fmt.Fprintf(writer, "进度: %d%%\n", i)
time.Sleep(time.Millisecond * 50)
}
}
实际应用示例
文件下载进度显示
func simulateDownload(writer *uilive.Writer) {
total := 100
for i := 0; i <= total; i++ {
// 清空之前的输出
fmt.Fprintf(writer, "\r")
// 显示进度条
progress := i * 50 / total
fmt.Fprintf(writer, "下载中: [%s%s] %d%%",
strings.Repeat("=", progress),
strings.Repeat(" ", 50-progress),
i)
time.Sleep(time.Millisecond * 100)
}
fmt.Fprintln(writer, "\n下载完成!")
}
func main() {
writer := uilive.New()
writer.Start()
defer writer.Stop()
simulateDownload(writer)
}
注意事项
- 确保在程序退出前调用
writer.Stop()
,否则终端可能会显示异常 - 避免在短时间内写入大量内容,这可能导致闪烁
- 对于复杂的UI,考虑使用更专业的库如
termui
或tview
- 在Windows上可能需要额外配置才能正常工作
uilive是一个简单但功能强大的库,特别适合需要基本终端实时更新功能的Go应用程序。它的轻量级设计和易用API使其成为许多命令行工具的理想选择。