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()
}

代码说明

  1. uilive.New() 创建一个新的writer实例
  2. writer.Start() 开始监听更新并渲染输出
  3. 使用fmt.Fprintf(writer, ...)fmt.Fprintln(writer, ...)向终端写入内容
  4. 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)
}

注意事项

  1. 确保在程序退出前调用writer.Stop(),否则终端可能会显示异常
  2. 避免在短时间内写入大量内容,这可能导致闪烁
  3. 对于复杂的UI,考虑使用更专业的库如termuitview
  4. 在Windows上可能需要额外配置才能正常工作

uilive是一个简单但功能强大的库,特别适合需要基本终端实时更新功能的Go应用程序。它的轻量级设计和易用API使其成为许多命令行工具的理想选择。

回到顶部