Gitrend
🔥

「Viper卒業!」Go設定管理の新星koanfがアツい!

Go 2026/1/29
Summary
皆さん、GoのConfig管理、どうしてますか? あのViperで「もうちょっとシンプルに…」って思ってた人に朗報です! 今回紹介する`knadh/koanf`、マジで衝撃でしたよ!

概要:なにこれ凄い?

「うおおお!これは来た!」って思わず声が出ちゃいましたね。GitHubトレンドでkoanfを見つけた時。 あの多機能だけど、時にはちょっと大仰に感じるViperの代わりを探してる人、結構いるんじゃないですか? koanfは「Simple, extremely lightweight, extensible」って説明文にある通り、まさにその言葉通りのライブラリなんです。 特に感動したのは、その拡張性とシンプルさ!ゴリゴリの機能てんこ盛りじゃないからこそ、本当に必要な機能だけをサッと使える。これ、開発体験が全然違うんですよ! 「設定管理はシンプルが一番」って哲学がひしひしと伝わってきて、僕の心は鷲掴みにされました!

ここが推し!

サクッと試そう(使用例)

Goでサクッと動かすなら、まずはこれやってみて! config.json を用意して、環境変数もセットして、CLI引数も渡す、っていう鉄板パターン。

package main

import (
	"fmt"
	"log"
	"strings"
	"time"

	"github.com/knadh/koanf/parsers/json"
	"github.com/knadh/koanf/providers/env"
	"github.com/knadh/koanf/providers/file"
	"github.com/knadh/koanf/v2"
)

func main() {
	var k = koanf.New(".")

	// 1. Load default config from file.
	// Sample config.json:
	// {
	//   "app": {
	//     "name": "MyKoanfApp"
	//   },
	//   "server": {
	//     "port": 8000
	//   },
	//   "debug": false,
	//   "db": {
	//     "host": "localhost",
	//     "port": 5432
	//   },
	//   "timeout": "5s"
	// }
	if err := k.Load(file.Provider("config.json"), json.Parser()); err != nil {
		log.Fatalf("Error loading config.json: %v", err)
	}

	// 2. Load environment variables with "MYAPP_" prefix, transforming keys.
	// E.g., MYAPP_SERVER_PORT=9000 -> server.port=9000
	k.Load(env.Provider("MYAPP_", ".", func(s string) string {
		s = strings.TrimPrefix(s, "MYAPP_") // Remove prefix
		s = strings.ToLower(s)              // Lowercase
		return strings.ReplaceAll(s, "_", ".") // Replace underscores with dots
	}), nil) // Use nil parser for env (it's string key-value)

	// 3. Command line args could be loaded here too, e.g., using pflag.Provider
	// For simplicity, we'll just demonstrate setting a value programmatically that might come from CLI
	k.Set("server.port", 8080) // This would typically come from CLI args or another provider

	fmt.Printf("App Name: %s\n", k.String("app.name"))
	fmt.Printf("Server Port: %d\n", k.Int("server.port"))
	fmt.Printf("Is Debug: %t\n", k.Bool("debug"))
	fmt.Printf("DB Host: %s\n", k.String("db.host"))
	fmt.Printf("DB Port: %d\n", k.Int("db.port"))
	fmt.Printf("Timeout: %s\n", k.Duration("timeout").String())
}

環境変数でMYAPP_SERVER_PORT=9000って設定してみたり、config.jsonを書き換えてみたりすると、設定のオーバーライドが実感できて面白いですよ!

ぶっちゃけ誰向け?

まとめ

いやー、knadh/koanf、本当に素晴らしいライブラリでした! Viperが提供する「全部入り」なアプローチとは対照的に、koanfは「シンプルさと拡張性」にフォーカスしてる。これが現代の開発スタイルにめちゃくちゃフィットするんですよ。 設定管理ってアプリの根幹だからこそ、軽量で信頼性が高いものを選びたい。その点、koanfは僕の期待を完全に超えてきました! これからのGoプロジェクトで設定管理に悩んだら、間違いなくkoanfが第一候補になりますね。皆さんもぜひ使ってみて、この感動を体験してください!未来の開発が楽しみになっちゃいますね!