Go言語でCLIを楽しく!Bubble Tea入門


Go言語でCLIを楽しく!Bubble Tea入門

charmbracelet/bubbletea

2025-08-13

やぁ、ソフトウェアエンジニアの皆さん!今日は、Go言語を使ったCLI開発を劇的に楽しくしてくれるフレームワーク「Bubble Tea」について、飲み比べコント風にご紹介しますね。

このお酒、見た目は素朴な「ターミナル画面」なんだけど、一口飲むと「わ、これすごい!」ってなるんですよ。

Bubble Tea は、Go言語でTUI(Terminal User Interface)を構築するためのフレームワークです。TUIっていうのは、ターミナル上でマウスを使ったり、キーボードでフォームに入力したり、リストを選択したりできる、ちょっとしたGUIみたいなものだと思ってください。

「CLIで十分じゃん?」って思うかもしれませんが、Bubble Tea を使うと、ユーザー体験がグッと向上します。例えば、ログをリアルタイムで表示したり、設定項目をインタラクティブに選択させたり、進捗バーを表示したりと、ただのコマンドラインツールを超えたリッチなアプリケーションが作れるんです。

飲み比べポイント特徴
香りElmアーキテクチャという、状態管理に優れた設計思想がベース。シンプルで分かりやすい。
味わいModel、Update、Viewという3つの要素で構成されている。このシンプルさが、大規模なアプリケーションでもコードをきれいに保つ秘訣。
後味Go言語の強力な並行処理と相性が良く、非同期処理も楽々。

このお酒が真価を発揮するのは、こんな時です。

複雑な設定が必要なCLIツール
設定ファイルを直接編集させる代わりに、対話形式で設定をウィザード形式で進められるツール。

長時間かかる処理の進捗表示
ただ...と表示するだけでなく、プログレスバーや処理中の詳細なログをリアルタイムで表示する。

サーバー監視ツール
ターミナル上でCPU使用率やメモリ使用率をリアルタイムグラフで表示したり、サービスを再起動するボタンを表示したり。

例えば、「Docker のコンテナを停止しますか?」「停止するコンテナを選んでください」といった対話的な操作を、ターミナル上でかっこよく実現できます。

さあ、この美味しいお酒をどうやって手に入れるか、ですよね。

まずはGoプロジェクトにBubble Teaを導入します。

go get github.com/charmbracelet/bubbletea

これだけでOKです。

では、実際に一杯飲んでみましょう!ごくシンプルなカウンターアプリのサンプルコードです。

package main

import (
	"fmt"
	tea "github.com/charmbracelet/bubbletea"
	"os"
)

// Model はアプリケーションの状態を保持します
type model struct {
	count int
}

// Init はプログラム開始時の初期化を行います
func (m model) Init() tea.Cmd {
	return nil
}

// Update はユーザーの入力やイベントに応じて Model を更新します
func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
	switch msg := msg.(type) {
	case tea.KeyMsg:
		switch msg.String() {
		case "ctrl+c", "q":
			return m, tea.Quit // プログラムを終了
		case "+":
			m.count++ // カウンターを増やす
		case "-":
			m.count-- // カウンターを減らす
		}
	}
	return m, nil
}

// View は現在の Model の状態を元に、表示する内容を返します
func (m model) View() string {
	s := fmt.Sprintf("現在のカウント: %d\n\n", m.count)
	s += "'+' で増やす, '-' で減らす, 'q' で終了\n"
	return s
}

func main() {
	p := tea.NewProgram(model{})
	if _, err := p.Run(); err != nil {
		fmt.Println("実行中にエラーが発生しました:", err)
		os.Exit(1)
	}
}

上記のコードを main.go として保存し、以下のコマンドで実行します。

go run main.go

ターミナルで + キーや - キーを押してみてください。カウンターの数字がリアルタイムで変化するのがわかるはずです。q キーでプログラムが終了します。

model
アプリケーションの「状態」を保持する構造体。この例では count だけですね。

Init()
プログラムが起動した時に一度だけ呼ばれる。特に初期化処理がなければ nil を返せばOK。

Update()
ユーザーがキーを押したり、何らかのイベントが発生したときに呼ばれます。msg(メッセージ)を見て、model を更新し、更新後の model と次のアクションを返します。

View()
現在の model の状態を元に、ターミナルに表示する文字列を返します。

この3つのシンプルなコンポーネントが、Bubble Tea の魅力的な味わいを生み出しているんです。


charmbracelet/bubbletea




ソフトウェアエンジニア必見!Cobraで実現するプロ級Go CLIツール

「コマンドの解析が面倒だ…」 「ヘルプメッセージをいちいち書くのが大変…」 「サブコマンドをうまく管理できない…」もう大丈夫です!そんな悩みとは今日でサヨナラ。 今回は、あなたの開発を劇的にラクにする、魔法のツール「Cobra」をご紹介します!


【エンジニア向け】Infisicalで秘密情報も体重もスマートに管理!

ダイエット中のエンジニアさん、お疲れ様です!食事制限、運動、そしてコード. .. 毎日やることがいっぱいですよね。でも、ちょっと待ってください!あなたのコードの中にも、ひっそりと隠れている「秘密」はありませんか?そう、APIキーとかデータベースのパスワードとか


Go言語エンジニアのためのWhatsApp連携術:whatsmeow徹底解説

whatsmeow は、Go言語(Golang)で書かれた、WhatsApp Web のマルチデバイス API を扱うためのライブラリです。「マルチデバイス API」というのがポイントで、スマートフォンがオフラインでも機能する、新しいWhatsAppの仕組みに対応しています。つまり、これを使えば、プログラムからWhatsAppのメッセージを送受信したり、アカウント情報を管理したりといった操作が可能になります。


【脱Electron】Go製TUIクライアント「Discordo」が開発環境を最適化する理由

Discordoは、Discordのクライアントをターミナル上(TUI Terminal User Interface)で動作させるための軽量かつセキュアなソフトウェアです。言語・環境 Go言語 (Golang) で書かれており、Linux環境での利用が想定されています。


【爆速】autobrr/qui で実現する、qBittorrent 複数管理の極上体験

autobrr/qui を一言で表すなら、まさに「職人が注いだ、雑味のない生ビール」のようなツールです。余計なものを削ぎ落とし、必要な機能だけを最高速で提供してくれます。エンジニア的な視点で見ると、このツールがいかに洗練されているかが分かります。


妹が教える!エンジニアのためのOllama活用術

ねえねえ、最近流行りの「Ollama」って知ってる?お兄ちゃんの好きそうな、めちゃくちゃ便利なツールなんだよ!Ollamaはね、お兄ちゃんのパソコンで、いろんなAIモデルを簡単に動かせるようにしてくれるすごーいツールなんだ!今までだと、AIモデルを使おうと思ったら、いろいろ難しそうな設定をしなきゃいけなかったり、パソコンの性能が足りなかったりしたんだけど、Ollamaを使えば、そんな心配はほとんどいらなくなるんだって!


Dockerだけじゃない!Moby Projectで自作コンテナ環境を構築する

Moby Project ってのはな、一言で言うと「コンテナをベースにしたシステムを作るための、オープンソースのツールキット」だ。例えるなら、俺たちが事件現場で使う道具一式、例えば手錠とか懐中電灯とか、そういうのを全部まとめて提供してくれるようなもんだな。


GOWA参上!WhatsApp自動化で開発効率を爆上げだ!

悪の組織に立ち向かう戦隊ヒーローのように、私たちソフトウェアエンジニアも日夜、様々な課題と戦っています。その中でも「WhatsAppの自動化」は、多くの人が直面する難題の一つでした。しかし、GOWAという強力な味方が現れました!GOWAは、Go言語で開発されたWhatsApp REST APIです。簡単に言うと、あなたのプログラムからWhatsAppを操作できるようにするツールですね。これまでのWhatsApp自動化は、ブラウザを操作したり、非公式なライブラリを使ったりと、不安定なものが多かったんです。でもGOWAは、公式のWhatsApp Webマルチデバイス機能に対応しているので、安定性が格段に向上しました!


もう悩まない! Go言語からRedisを使うためのベストパートナー「Redis Goクライアント」

そうですね、彼女がたくさんの水着の中から、どれが一番自分に似合うか、海辺で輝けるかを悩むように、私たちソフトウェアエンジニアも、たくさんのライブラリの中から、どのツールがプロジェクトに最適か、効率的に開発できるかを悩むことがあります。今回は、その悩みを解決してくれる頼もしい相棒の一つ、Redis Go clientについて、彼女の水着選びをサポートする優しい彼氏のように、分かりやすく丁寧に解説していきますね!


牛丼一筋の心意気で学ぶ、Go言語とgRPCによる高速RPC通信

一言でいうと、「Go言語でサクッとマイクロサービスを構築するための、うまい、早い、安いRPCフレームワーク」です。RPC(Remote Procedure Call)とは、ネットワーク越しに別々のプログラムの関数を呼び出す仕組みのこと。簡単に言えば、サーバーの機能(関数)を、クライアントからまるで自分のプログラム内の関数のように呼び出せるようにしてくれる技術です。