golang实现Windows终端彩色输出插件库go-colorable的使用

go-colorable

go-colorable 是一个用于 Windows 终端的彩色输出插件库。

问题背景

在 Windows 终端中,大多数日志记录包默认不会显示颜色(虽然可以使用 ansicon 实现,但可能不是理想的解决方案)。go-colorable 可以在 Windows 上处理 ANSI 颜色转义序列。

效果对比

不使用 go-colorable 的效果

不使用 go-colorable 的效果

使用 go-colorable 的效果

使用 go-colorable 的效果

使用方法

下面是一个完整的示例代码,展示如何在 Windows 终端中实现彩色输出:

package main

import (
	"github.com/mattn/go-colorable"
	"github.com/sirupsen/logrus"
)

func main() {
	// 设置日志格式,强制使用颜色
	logrus.SetFormatter(&logrus.TextFormatter{ForceColors: true})
	
	// 设置输出为支持颜色的标准输出
	logrus.SetOutput(colorable.NewColorableStdout())

	// 输出不同级别的日志(将显示不同颜色)
	logrus.Info("succeeded")      // 通常显示绿色
	logrus.Warn("not correct")    // 通常显示黄色
	logrus.Error("something error") // 通常显示红色
	logrus.Fatal("panic")         // 通常显示红色并退出程序
}

这段代码可以在非 Windows 操作系统上编译运行。

安装

要使用 go-colorable,首先需要通过以下命令安装:

go get github.com/mattn/go-colorable

许可证

MIT 许可证

作者

Yasuhiro Matsumoto (a.k.a mattn)


更多关于golang实现Windows终端彩色输出插件库go-colorable的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang实现Windows终端彩色输出插件库go-colorable的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


go-colorable 使用指南:在Windows终端实现彩色输出

go-colorable 是一个用于在Windows终端中实现彩色输出的Go语言库,它解决了Windows控制台默认不支持ANSI颜色代码的问题。

安装

go get github.com/mattn/go-colorable

基本使用

package main

import (
	"fmt"
	"github.com/mattn/go-colorable"
)

func main() {
	// 创建支持颜色的输出对象
	out := colorable.NewColorableStdout()
	
	// 使用ANSI颜色代码输出彩色文本
	fmt.Fprintln(out, "\x1b[31m红色文本\x1b[0m")
	fmt.Fprintln(out, "\x1b[32m绿色文本\x1b[0m")
	fmt.Fprintln(out, "\x1b[33m黄色文本\x1b[0m")
	fmt.Fprintln(out, "\x1b[34m蓝色文本\x1b[0m")
	fmt.Fprintln(out, "\x1b[35m紫色文本\x1b[0m")
	fmt.Fprintln(out, "\x1b[36m青色文本\x1b[0m")
	fmt.Fprintln(out, "\x1b[37m白色文本\x1b[0m")
	
	// 带背景色的文本
	fmt.Fprintln(out, "\x1b[41;37m白字红底\x1b[0m")
	fmt.Fprintln(out, "\x1b[42;30m黑字绿底\x1b[0m")
	
	// 加粗文本
	fmt.Fprintln(out, "\x1b[1m加粗文本\x1b[0m")
}

高级用法

1. 同时支持标准输出和错误输出

package main

import (
	"fmt"
	"github.com/mattn/go-colorable"
)

func main() {
	stdout := colorable.NewColorableStdout()
	stderr := colorable.NewColorableStderr()
	
	fmt.Fprintln(stdout, "\x1b[32m正常消息\x1b[0m")
	fmt.Fprintln(stderr, "\x1b[31m错误消息\x1b[0m")
}

2. 创建带颜色的日志记录器

package main

import (
	"log"
	"os"
	"github.com/mattn/go-colorable"
)

func main() {
	log.SetOutput(colorable.NewColorableStdout())
	
	log.Println("\x1b[32m[INFO]\x1b[0m 这是一条信息日志")
	log.Println("\x1b[33m[WARN]\x1b[0m 这是一条警告日志")
	log.Println("\x1b[31m[ERROR]\x1b[0m 这是一条错误日志")
}

3. 封装颜色函数方便使用

package main

import (
	"fmt"
	"github.com/mattn/go-colorable"
)

var out = colorable.NewColorableStdout()

// 定义颜色函数
func red(s string) string {
	return "\x1b[31m" + s + "\x1b[0m"
}

func green(s string) string {
	return "\x1b[32m" + s + "\x1b[0m"
}

func yellow(s string) string {
	return "\x1b[33m" + s + "\x1b[0m"
}

func main() {
	fmt.Fprintln(out, red("错误信息"))
	fmt.Fprintln(out, green("成功信息"))
	fmt.Fprintln(out, yellow("警告信息"))
}

ANSI颜色代码参考

代码 效果
\x1b[0m 重置所有属性
\x1b[1m 加粗/高亮
\x1b[4m 下划线
\x1b[30m 黑色前景
\x1b[31m 红色前景
\x1b[32m 绿色前景
\x1b[33m 黄色前景
\x1b[34m 蓝色前景
\x1b[35m 紫色前景
\x1b[36m 青色前景
\x1b[37m 白色前景
\x1b[40m 黑色背景
\x1b[41m 红色背景
\x1b[42m 绿色背景
\x1b[43m 黄色背景
\x1b[44m 蓝色背景
\x1b[45m 紫色背景
\x1b[46m 青色背景
\x1b[47m 白色背景

注意事项

  1. go-colorable 主要用于解决Windows终端的ANSI颜色支持问题,在Unix-like系统上也能正常工作
  2. 某些旧版本的Windows控制台可能仍然不支持ANSI颜色代码
  3. 使用颜色代码时记得在最后重置(\x1b[0m),否则后续输出都会保持该样式
  4. 对于更复杂的终端UI,可以考虑使用更高级的库如termbox-go或tcell

通过go-colorable,你可以轻松地为你的命令行工具添加彩色输出,提升用户体验和可读性。

回到顶部