ZetCode

Go 终端颜色

最后修改时间 2024 年 4 月 11 日

在本文中,我们将展示如何输出终端彩色输出。

过去,在 Windows 终端上无法显示颜色。随着现代 Windows 终端应用程序的引入,这种情况已经改变。

要显示彩色输出,我们将使用特殊的转义序列。我们还使用 fatih/coloraurora 包。

转义序列

ANSI 转义序列是用于控制终端模拟器中光标位置、颜色、字体样式和其他选项的标准。

main.go
package main

import (
    "fmt"
)

func main() {

    msg := "an old falcon"

    reset := "\033[0m"
    bold := "\033[1m"
    underline := "\033[4m"
    strike := "\033[9m"
    italic := "\033[3m"

    cRed := "\033[31m"
    cGreen := "\033[32m"
    cYellow := "\033[33m"
    cBlue := "\033[34m"
    cPurple := "\033[35m"
    cCyan := "\033[36m"
    cWhite := "\033[37m"

    fmt.Println(msg)

    fmt.Println(cRed + msg)
    fmt.Println(cGreen + msg)
    fmt.Println(cYellow + msg)
    fmt.Println(cBlue + msg)
    fmt.Println(cPurple + msg)
    fmt.Println(cWhite + msg)
    fmt.Println(cCyan + msg + reset)

    fmt.Println(bold + msg)
    fmt.Println(italic + msg + reset)
    fmt.Println(strike + msg + reset)
    fmt.Println(underline + msg + reset)
    fmt.Println(msg)
}

在程序中,我们以彩色和常见的样式(如粗体和斜体)显示消息。

reset := "\033[0m"

重置信号用于终止当前的颜色或样式信号。

bold := "\033[1m"
underline := "\033[4m"
strike := "\033[9m"
italic := "\033[3m"

这些是使用转义码定义的四种常见文本样式。

cRed := "\033[31m"
cGreen := "\033[32m"
cYellow := "\033[33m"
cBlue := "\033[34m"
cPurple := "\033[35m"
cCyan := "\033[36m"
cWhite := "\033[37m"

这些是基本颜色的代码。

fmt.Println(cRed + msg)
fmt.Println(cGreen + msg)
fmt.Println(cYellow + msg)

要以彩色显示文本,我们在文本前加上转义序列。

fmt.Println(bold + msg)
fmt.Println(italic + msg + reset)

转义序列可以组合。第一条消息以粗体显示。由于它没有以重置代码终止,因此下一条消息以粗体和斜体显示。

使用 faith/color 的终端颜色

faith/color 包允许我们使用 ANSI Escape 代码进行着色输出。它本质上是这些代码的一个易于使用的包装器。该包有多种设置终端颜色输出的方式。

main.go
package main

import (
    "fmt"

    "github.com/fatih/color"
)

func main() {

    msg := "an old falcon"
    fmt.Println(msg)

    color.Set(color.FgHiBlue)

    fmt.Println(msg)
    fmt.Println(msg)

    color.Unset()

    fmt.Println(msg)
}

在程序中,我们使用 SetUnset 函数来界定输出设置为特定颜色的区域。

color.Set(color.FgHiBlue)

我们将颜色设置为蓝色。

color.Unset()

我们取消设置颜色。调用函数后,输出恢复为默认颜色。


在下一个示例中,我们使用内置函数以彩色显示文本。

main.go
package main

import (
    "fmt"

    "github.com/fatih/color"
)

func main() {

    color.Green("%d old falcons", 4)
    color.Red("%d old falcons", 3)
    color.Yellow("%d old falcon", 1)

    fmt.Println()

    red := color.New(color.FgRed, color.BgHiWhite, color.Bold, color.Italic, color.Underline)
    msg := "an old falcon"
    red.Println(msg)
}

我们以彩色打印几条消息。

color.Green("%d old falcons", 4)
color.Red("%d old falcons", 3)
color.Yellow("%d old falcon", 1)

这些是用于以绿色、红色和黄色显示消息的三种内置函数。

red := color.New(color.FgRed, color.BgHiWhite, color.Bold, color.Italic, color.Underline)
msg := "an old falcon"
red.Println(msg)

我们可以组合各种样式。除了前景颜色,我们还可以设置背景颜色。

使用 aurora 的终端颜色

Aurora 是最复杂的 ANSI 颜色代码包。它直接支持 Printf/Sprintf 方法。

main.go
package main

import (
    "fmt"

    "github.com/logrusorgru/aurora/v4"
)

func main() {

    msg := " an old falcon "

    fmt.Println(aurora.Gray(0, msg).BgGray(23))
    fmt.Println(aurora.Gray(3, msg).BgGray(19))
    fmt.Println(aurora.Gray(7, msg).BgGray(15))
    fmt.Println(aurora.Gray(11, msg).BgGray(13))
    fmt.Println(aurora.Gray(15, msg).BgGray(7))
    fmt.Println(aurora.Gray(19, msg).BgGray(3))
    fmt.Println(aurora.Gray(23, msg).BgGray(0))
}

在程序中,我们显示灰色阴影的消息。

fmt.Println(aurora.Gray(0, msg).BgGray(23))

我们链接了两个函数调用:GrayBgGray。第一个设置前景颜色,第二个设置背景颜色。索引是 0 到 24 的值。


我们可以将 Aurora 函数与 PrintfSprintf 函数一起使用。

main.go
package main

import (
    "fmt"

    "github.com/logrusorgru/aurora/v4"
)

func main() {

    msg := "an old falcon"

    fmt.Println(msg, aurora.BrightBlue("in the sky"))
    fmt.Printf("%s in the sky\n", aurora.Bold(aurora.BrightBlue(msg)))
    fmt.Println(aurora.Sprintf(aurora.Blue("John Doe is a %s"), aurora.Green("gardener")))
}

该程序展示了如何使用 PrintfSprintf 函数显示彩色文本。


ColorIndex 是预定义的 8 位前景或背景颜色的索引,范围从 0 到 255。

main.go
package main

import (
    "fmt"

    "github.com/logrusorgru/aurora/v4"
)

func main() {

    msg := "an old falcon"

    for i := 1; i <= 255; i++ {
        fmt.Printf("%3d %s %s\n", i, aurora.Index(aurora.ColorIndex(i), msg),
            aurora.BgIndex(aurora.ColorIndex(i), msg))
    }
}

在程序中,我们展示了 255 种前景和背景文本颜色组合。

来源

Go aurora - Github 页面

在本文中,我们在 Golang 的终端应用程序中创建了彩色输出。我们使用了 ANSI 转义码和两个库。

作者

我叫 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教学编程方面拥有十多年的经验。

列出所有 Go 教程