ColorLib
是一个功能强大、高性能的 Go 语言终端颜色输出库。它提供了丰富的颜色输出功能,支持标准颜色和亮色系列,具备样式设置(粗体、下划线、闪烁)、链式调用、自定义输出接口、线程安全等特性,专为提升命令行程序的用户体验而设计。
- 🎨 丰富的颜色支持:16种标准颜色 + 7种亮色,满足各种场景需求
- 🔗 链式调用:支持流畅的链式API,代码更简洁优雅
- 🎯 多种输出方式:直接打印、格式化输出、字符串返回
- 🏷️ 日志级别支持:内置 Debug、Info、Ok、Warn、Error 等级别
- 🎭 样式控制:支持粗体、下划线、闪烁等文本效果
- 🔒 线程安全:全局实例和并发操作完全安全
- 📝 自定义输出:支持输出到文件、缓冲区等任意 io.Writer
- ⚡ 高性能:内置对象池和智能缓存,减少内存分配
- 🧪 完整测试:99+ 测试用例,覆盖率 > 90%
go get gitee.com/MM-Q/colorlib
package main
import (
"gitee.com/MM-Q/colorlib"
)
func main() {
// 使用全局实例(推荐)
cl := colorlib.GetCL()
// 基础颜色输出
cl.Red("这是红色文本")
cl.Green("这是绿色文本")
cl.Blue("这是蓝色文本")
// 格式化输出
cl.Yellowf("用户 %s 登录成功,时间:%s\n", "张三", "2024-01-01")
// 日志级别输出
cl.PrintInfo("系统启动中...")
cl.PrintOk("启动成功!")
cl.PrintWarn("内存使用率较高")
cl.PrintError("连接数据库失败")
// 返回带颜色的字符串
coloredMsg := cl.Sgreen("成功处理 100 条记录")
fmt.Println(coloredMsg)
}
颜色名称 | 方法名 | 颜色代码 | 示例 |
---|---|---|---|
黑色 | Black() |
30 | cl.Black("黑色文本") |
红色 | Red() |
31 | cl.Red("红色文本") |
绿色 | Green() |
32 | cl.Green("绿色文本") |
黄色 | Yellow() |
33 | cl.Yellow("黄色文本") |
蓝色 | Blue() |
34 | cl.Blue("蓝色文本") |
品红色 | Magenta() |
35 | cl.Magenta("品红色文本") |
青色 | Cyan() |
36 | cl.Cyan("青色文本") |
白色 | White() |
37 | cl.White("白色文本") |
灰色 | Gray() |
90 | cl.Gray("灰色文本") |
颜色名称 | 方法名 | 颜色代码 | 示例 |
---|---|---|---|
亮红色 | BrightRed() |
91 | cl.BrightRed("亮红色文本") |
亮绿色 | BrightGreen() |
92 | cl.BrightGreen("亮绿色文本") |
亮黄色 | BrightYellow() |
93 | cl.BrightYellow("亮黄色文本") |
亮蓝色 | BrightBlue() |
94 | cl.BrightBlue("亮蓝色文本") |
亮品红色 | BrightMagenta() |
95 | cl.BrightMagenta("亮品红色文本") |
亮青色 | BrightCyan() |
96 | cl.BrightCyan("亮青色文本") |
亮白色 | BrightWhite() |
97 | cl.BrightWhite("亮白色文本") |
级别 | 方法名 | 前缀 | 颜色 | 使用场景 |
---|---|---|---|---|
Debug | PrintDebug() |
debug: |
品红色 | 调试信息 |
Info | PrintInfo() |
info: |
蓝色 | 一般信息 |
Ok | PrintOk() |
ok: |
绿色 | 成功操作 |
Warn | PrintWarn() |
warn: |
黄色 | 警告信息 |
Error | PrintError() |
error: |
红色 | 错误信息 |
cl := colorlib.GetCL()
cl.PrintDebug("调试信息:变量值为", value)
cl.PrintInfo("正在处理用户请求...")
cl.PrintOk("数据保存成功")
cl.PrintWarn("磁盘空间不足")
cl.PrintError("网络连接超时")
// 格式化版本
cl.PrintDebugf("用户ID: %d, 状态: %s", userID, status)
cl.PrintInfof("处理进度: %d%%", progress)
cl := colorlib.NewColorLib()
// 设置样式
cl.SetColor(true) // 启用颜色
cl.SetBold(true) // 启用粗体
cl.SetUnderline(true) // 启用下划线
cl.SetBlink(true) // 启用闪烁
cl.Red("带样式的红色文本")
cl := colorlib.NewColorLib()
// 链式设置样式
cl.WithColor(true).
WithBold(true).
WithUnderline(true).
Red("链式调用的红色粗体下划线文本")
cl := colorlib.NewColorLib()
cl.SetColor(false) // 禁用颜色,适用于日志文件输出
cl.Red("这将显示为普通文本")
cl.Red("直接打印红色文本") // 输出后自动换行
cl.Green("直接打印绿色文本") // 输出后自动换行
cl.Redf("用户: %s", username) // 格式化输出,不自动换行
cl.Greenf("状态: %s", status) // 需要手动添加 \n
redText := cl.Sred("红色字符串") // 返回带颜色的字符串
greenText := cl.Sgreen("绿色字符串") // 返回带颜色的字符串
fmt.Println(redText, greenText)
coloredMsg := cl.Sredf("错误代码: %d", errorCode)
log.Println(coloredMsg) // 可以传递给其他日志库
// 输出到文件
file, _ := os.Create("colored_log.txt")
defer file.Close()
cl := colorlib.NewColorLibWithWriter(file)
cl.Red("这将写入文件")
// 输出到缓冲区
var buf bytes.Buffer
cl := colorlib.NewColorLibWithWriter(&buf)
cl.Green("这将写入缓冲区")
fmt.Println(buf.String())
// 使用 WithWriter 创建新实例
cl1 := colorlib.GetCL()
cl2 := cl1.WithWriter(os.Stderr) // 输出到标准错误
cl2.Red("错误信息")
// 方式1: 使用全局实例(推荐)
cl := colorlib.GetCL() // 线程安全的单例
cl.Red("使用全局实例")
// 方式2: 创建新实例
cl := colorlib.NewColorLib() // 或者 colorlib.New()
cl.Red("使用新实例")
// 方式3: 指定输出接口
cl := colorlib.NewColorLibWithWriter(os.Stderr)
cl.Red("输出到标准错误")
cl := colorlib.GetCL() // 全局实例是线程安全的
// 在多个 goroutine 中安全使用
go func() {
cl.Red("Goroutine 1")
}()
go func() {
cl.Green("Goroutine 2")
}()
函数名 | 描述 |
---|---|
GetCL() |
获取全局单例实例(线程安全) |
NewColorLib() |
创建新实例(输出到 stdout) |
New() |
NewColorLib() 的别名 |
NewColorLibWithWriter(io.Writer) |
创建指定输出接口的实例 |
方法名 | 描述 |
---|---|
SetColor(bool) |
设置是否启用颜色 |
SetBold(bool) |
设置是否启用粗体 |
SetUnderline(bool) |
设置是否启用下划线 |
SetBlink(bool) |
设置是否启用闪烁 |
WithColor(bool) |
链式设置颜色(返回自身) |
WithBold(bool) |
链式设置粗体(返回自身) |
WithUnderline(bool) |
链式设置下划线(返回自身) |
WithBlink(bool) |
链式设置闪烁(返回自身) |
WithWriter(io.Writer) |
创建新的输出接口实例 |
前缀/后缀 | 说明 | 示例 |
---|---|---|
无前缀 | 直接打印(带换行) | Red("text") |
f 后缀 |
格式化打印(不换行) | Redf("user: %s", name) |
S 前缀 |
返回字符串 | Sred("text") |
S + f |
格式化返回字符串 | Sredf("user: %s", name) |
Bright 前缀 |
亮色版本 | BrightRed("text") |
func main() {
cl := colorlib.GetCL()
cl.PrintInfo("正在初始化...")
if err := initialize(); err != nil {
cl.PrintError("初始化失败:", err)
os.Exit(1)
}
cl.PrintOk("初始化完成")
cl.Green("欢迎使用 MyTool v1.0.0")
}
type Logger struct {
cl *colorlib.ColorLib
}
func NewLogger() *Logger {
return &Logger{cl: colorlib.GetCL()}
}
func (l *Logger) Info(msg string) {
l.cl.PrintInfo(msg)
}
func (l *Logger) Error(msg string) {
l.cl.PrintError(msg)
}
func TestSomething(t *testing.T) {
cl := colorlib.GetCL()
cl.PrintInfo("开始测试...")
if result := doSomething(); result {
cl.PrintOk("测试通过")
} else {
cl.PrintError("测试失败")
t.Fail()
}
}
cl := colorlib.NewColorLib()
// 根据环境变量决定是否启用颜色
if os.Getenv("NO_COLOR") != "" {
cl.SetColor(false)
}
// 输出到日志文件时禁用颜色
if isLogFile {
cl.SetColor(false)
}
cl := colorlib.GetCL()
cl.WithBold(true).WithUnderline(true) // 开发时使用更明显的样式
- 对象池技术:内置
strings.Builder
对象池,减少内存分配 - 智能缓存:ANSI 序列缓存,避免重复构建
- 零拷贝:优化的字符串操作,减少不必要的内存复制
- 并发安全:使用原子操作,无锁设计
运行所有测试:
go test ./...
运行竞态检测:
go test -race ./...
查看测试覆盖率:
go test -cover ./...
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。
欢迎提交 Issue 和 Pull Request!
- 项目地址:https://gitee.com/MM-Q/colorlib
- 问题反馈:Issues
⭐ 如果这个项目对你有帮助,请给个 Star 支持一下!