目录

Go 实现在终端输出颜色

目录

通常,我们会对不同等级的日志输出不同的颜色来区分。

fmt.Printf("\033[1;31;40m%s\033[0m\n","Red.")
fmt.Printf("\033[1;37;41m%s\033[0m\n","Red.")

第一行是红字黑底,第二行红底白字。

我们来解析 \033[1;31;40m%s\033[0m\n 这个字符串中的字符分别代表了什么。

  • \033\ 表示转义,\033 表示设置颜色。
  • [1;31;40m:定义颜色,[ 表示开始颜色设置,m 为颜色设置结束,以 ; 号分隔。1 代码,表示显示方式,31 表示前景颜色(文字的 颜色),40 表示背景颜色。
  • \033[0m:表示恢复终端默认样式。
// 前景 背景 颜色
// ---------------------------------------
// 30  40  黑色
// 31  41  红色
// 32  42  绿色
// 33  43  黄色
// 34  44  蓝色
// 35  45  紫红色
// 36  46  青蓝色
// 37  47  白色

// 3 位前景色, 4 位背景色

// 代码 意义
// -------------------------
//  0  终端默认设置
//  1  高亮显示
//  4  使用下划线
//  5  闪烁
//  7  反白显示
//  8  不可见
// Color defines a single SGR Code
type Color int

// Foreground text colors
const (
    FgBlack Color = iota + 30
    FgRed
    FgGreen
    FgYellow
    FgBlue
    FgMagenta
    FgCyan
    FgWhite
)

// Foreground Hi-Intensity text colors
const (
    FgHiBlack Color = iota + 90
    FgHiRed
    FgHiGreen
    FgHiYellow
    FgHiBlue
    FgHiMagenta
    FgHiCyan
    FgHiWhite
)

// Colorize a string based on given color.
func Colorize(s string, c Color) string {
    return fmt.Sprintf("\033[1;%s;40m%s\033[0m", strconv.Itoa(int(c)), s)
}

上面的代码输出:

/images/go-colorize/colorize.jpg