Goアドベントカレンダーその6が投稿されなかったので代理投稿です。Go界は殺伐しているので、隙を見せるとやられます。みなさんもお気をつけください。
GoでCLIツールを作るときにはいつも"github.com/fatih/color"パッケージを使っていたのですが、これが長らくメンテナンスされない宣言がされているため、移行先を探していました。で、最近使うようになったのが"github.com/gookit/color"です。
gookit/colorは多彩なモードをサポートしています。256色にも対応しています。僕は試していないですが、基本16色ならWindowsでも動作するようです。
基本色の使い方
fatih/colorと似た感じで使えます。fatih/colorの基本色の関数はPrintf相当で、gookit/colorはメソッド名が必須なのでちょっとコードは長くなりますが、みんながよく知るfmtと同じ体系のメソッドが提供されているので可読性は悪くはないでしょう。 .Printf
を挟み込めば移行は難しくないです。
ちなみに、fatih/colorの方も、color.Newで作ったColor構造体はfmtと同じメソッドを持つので、こちらの書き方をしていれば移行はもっとかんたんです。
// github.com/fatih/color
color.Red("We have red")
color.Magenta("And many others ..")
// github.com/gookit/color
color.Red.Println("Simple to use color")
color.Green.Print("Simple to use color")
color.Cyan.Printf("Simple to use %s\n", "color")
前景色・背景色・スタイルの合成
ちょっとシグネチャは違いますが、似たような感じで初期化して、同じように使えます。
// github.com/fatih/color
redOnWhite := color.New(color.FgRed).Add(color.BgWhite)
redOnWhite.Println("Red text with white background.")
// github.com/gookit/color
whiteOnBlack := color.New(color.FgWhite, color.BgBlack).Println("custom color style")
whiteOnBlack.Println("White text with black background.")
テーマ
これはgookit/colorにのみにあるモードです。Redなどの代わりに、Warning/Error/Suc(Successのこと)などを使うと、より抽象的にプログラミングすることができます。
Info
Note
Light
Error
Danger
Notice
Success
Comment
Primary
Warning
Question
Secondary
こんな感じで使います。
// github.com/gookit/color
color.Success.Println("Success message")
タグモード
これもgookit/colorにのみにあるモードです。スタイルをタグで書くと、それを整形してくれます。基本色や基本のスタイル(boldとか)はそのまま文字で書けますし、テーマの名前もそのまま使えます。前景色・背景色・スタイルを自由に組み合わせるときは、fg=/bg=/op=を組み合わせて書きます。
// github.com/gookit/color
color.Print("<red>Red Text</>")
color.Print("<error>Error</>\n")
color.Print("<fg=yellow;bg=black;op=underscore;>Warning</>\n")
Print()
などの代わりにClearTag()
関数を使うと、タグ抜きのテキストが出力されます。ユニットテストではスタイルは無視して中身のテキストの一致だけみたい、というケースでとても便利に使えます。
color.ClearTag("<red>Red Text</>")
// Red Text
注意点も少しあります:
- 閉じタグは開きタグの種類の限らず必ず
</>
- タグのネストはできない
- 本文に似た形式のタグ(HTMLやXMLのタグ)があると、正常に出力されないことがある
まとめ
ということで、github.com/gookit/colorの紹介でした。