num30-config
Go言語で、num30/configライブラリを用いて、設定ファイルの読み込み、環境変数やコマンドライン引数の利用、設定の検証、変更監視など、Goアプリケーションの設定に関する様々な処理を記述・デバッグ・説明するSkill。
📜 元の英語説明(参考)
Write, debug, and explain Go configuration code using the github.com/num30/config library. Use this skill when the user asks to set up config structs, read from files/env vars/CLI flags, validate config, watch for changes, or use the num30/config package in Go applications.
🇯🇵 日本人クリエイター向け解説
Go言語で、num30/configライブラリを用いて、設定ファイルの読み込み、環境変数やコマンドライン引数の利用、設定の検証、変更監視など、Goアプリケーションの設定に関する様々な処理を記述・デバッグ・説明するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o num30-config.zip https://jpskill.com/download/8682.zip && unzip -o num30-config.zip && rm num30-config.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/8682.zip -OutFile "$d\num30-config.zip"; Expand-Archive "$d\num30-config.zip" -DestinationPath $d -Force; ri "$d\num30-config.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
num30-config.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
num30-configフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
[Skill 名] num30-config
このスキルは、宣言的な Go 設定ライブラリである num30/config (github.com/num30/config) に関する包括的な知識を提供します。このライブラリは、YAML/JSON/TOML ファイル、環境変数、およびコマンドラインフラグから設定を一度の呼び出しで読み取ります。
クイックリファレンス
インストール:
go get github.com/num30/config
最小限の使用例:
import "github.com/num30/config"
type Config struct {
Host string `default:"localhost" validate:"required"`
Port int `default:"8080"`
}
func main() {
var cfg Config
err := config.NewConfReader("myapp").Read(&cfg)
if err != nil {
panic(err)
}
}
設定ソースと優先順位
値は次の順序でマージされます(優先順位が高いものが勝ちます)。
- コマンドラインフラグ (
--host=localhost) - 環境変数 (
HOST=localhost) - 設定ファイル (
myapp.yaml) - 構造体タグのデフォルト値 (
default:"localhost")
構造体タグ
| タグ | 目的 | 例 |
|---|---|---|
default:"val" |
デフォルト値 | default:"localhost" |
validate:"rule" |
バリデーションルール (go-playground/validator) | validate:"required" |
flag:"name" |
CLI フラグ名を上書き | flag:"debug" |
envvar:"NAME" |
環境変数名を上書き | envvar:"DB_PASS" |
usage:"text" |
フラグの使用法/ヘルプテキスト | usage:"enable debug logging" |
mapstructure:",squash" |
埋め込み構造体のフィールドを親レベルに統合 | 下記参照 |
ConfReader ビルダー API
config.NewConfReader("myapp") // リーダーを作成 (設定名 = ファイル名 + 環境変数プレフィックスベース)
.WithSearchDirs("/etc/conf", "./") // 設定ファイルの検索ディレクトリを上書き (デフォルト: ホームディレクトリ + カレントディレクトリ)
.WithPrefix("MYAPP") // 環境変数のプレフィックス: MYAPP_DB_HOST
.Read(&cfg) // 構造体を読み込んで設定 (エラーを返す)
設定のライブ変更を監視:
reader := config.NewConfReader("myapp")
err := reader.Read(&cfg)
mutex := reader.Watch() // Read() の後に呼び出す; 前に呼び出すと panic
// スレッドセーフなアクセス:
mutex.RLock()
val := cfg.SomeField
mutex.RUnlock()
設定ファイル
- ファイル名:
<configName>.yaml(または.json,.toml,.hcl,.ini,.env,.properties) - 検索順序: ホームディレクトリ、次にカレントディレクトリ (
WithSearchDirsで上書き) - フィールド名マッピング: camelCase → lower camelCase YAML キー
# 構造体フィールド DB.DbName の場合:
db:
dbName: "mydb"
環境変数
- デフォルトパターン: ドットを
_に置き換え、大文字にしたFIELD_PATHApp.Server.Port→APP_SERVER_PORT
- プレフィックス付き:
NewConfReader("x").WithPrefix("MYAPP")→MYAPP_APP_SERVER_PORT envvarタグで上書き:Password string \envvar:"DB_PASS"`→DB_PASS` から読み取る
コマンドラインフラグ
- デフォルトパターン: 小文字のドット区切りパスに
--プレフィックスを付加App.Server.Port→--app.server.port=8080
- Boolean フラグ: フラグのみを渡す (値は不要):
--verbose flagタグで上書き:Debug bool \flag:"debug"`→--debug`- スライス: フラグを繰り返す:
--slice a --slice b - バイトスライス: base64 エンコード:
--bytes dGVzdA==
完全な例
package main
import (
"fmt"
"time"
"github.com/num30/config"
)
type Config struct {
GlobalConfig `mapstructure:",squash"` // squash: フィールドがトップレベルに昇格
Debug bool
DB DatabaseConfig
DefaultVal string `default:"default value"`
Tags []string `default:"[\"a\",\"b\"]"`
}
type GlobalConfig struct {
Verbose bool `flag:"verbose" usage:"enable verbose logging"`
}
type DatabaseConfig struct {
Host string `default:"localhost" validate:"required"`
Password string `validate:"required" envvar:"DB_PASS"`
DbName string `default:"mydb"`
Username string `default:"root"`
Port int `default:"5432"`
Timeout time.Duration `default:"30s"`
}
func main() {
var cfg Config
err := config.NewConfReader("myapp").
WithSearchDirs("/etc/myapp", "./").
WithPrefix("MYAPP").
Read(&cfg)
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", cfg)
}
Squash 埋め込み
埋め込み構造体で mapstructure:",squash" を使用して、そのフィールドを設定ファイルと環境変数で親レベルに昇格させます。
type GlobalConfig struct { Verbose bool }
type AppConfig struct {
GlobalConfig `mapstructure:",squash"` // `globalConfig.verbose` ではなく `verbose` としてアクセス
Name string
}
設定ファイル: verbose: true (globalConfig.verbose: true ではない)
環境変数: VERBOSE=true (GLOBAL_CONFIG_VERBOSE=true ではない)
サポートされている Go の型
すべてのプリミティブ型は、設定フィールドとしてサポートされています。
bool, int/int8/int16/int32/int64, uint/uint8/uint16/uint32/uint64, float32/float64, string, []string, []byte (フラグ/環境変数では base64), time.Duration
バリデーション
構造体フィールドで go-playground/validator タグを使用します。
type Config struct {
Host string `validate:"required"`
Port int `validate:"min=1,max=65535"`
Email string `validate:"required,email"`
}
制約に違反した場合、Read() はバリデーションエラーを返します。タグの完全なリストについては、validator docs を参照してください。
組み込み設定構造体 (lib パッケージ)
import "github.com/num30/config/lib"
type Config struct {
DB lib.PostgresqlDb // 妥当なデフォルト値を持つ Host, Password, DbName, Username, Port, SslEnabled を提供
}
// 接続文字列を取得:
connStr := cfg.DB.GetConnString()
// → "host=localhost user=postgres password=pass database= port=5432 sslmode=disable"
lib.PostgresqlDb のデフォルト値: Host:"localhost", Password:"pass", Username:"postgres", Port:5432, SslEnabled:false
スライス
type Config struct {
Slice []string
}
| ソース | フォーマット |
|---|---|
| 環境変数 | SLICE=a,b,c |
| 設定ファイル | slice: ["a", "b", "c"] |
| CLI フラグ | --slice a --slice b |
エラー処理
Read() は err を返します
(原文はここで切り詰められています)
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
This skill provides comprehensive knowledge of num30/config (github.com/num30/config), a declarative Go configuration library that reads config from YAML/JSON/TOML files, environment variables, and command-line flags in a single call.
Quick Reference
Install:
go get github.com/num30/config
Minimal usage:
import "github.com/num30/config"
type Config struct {
Host string `default:"localhost" validate:"required"`
Port int `default:"8080"`
}
func main() {
var cfg Config
err := config.NewConfReader("myapp").Read(&cfg)
if err != nil {
panic(err)
}
}
Configuration Sources & Priority
Values are merged in this order (highest priority wins):
- Command-line flags (
--host=localhost) - Environment variables (
HOST=localhost) - Config file (
myapp.yaml) - Struct tag defaults (
default:"localhost")
Struct Tags
| Tag | Purpose | Example |
|---|---|---|
default:"val" |
Default value | default:"localhost" |
validate:"rule" |
Validation rule (go-playground/validator) | validate:"required" |
flag:"name" |
Override CLI flag name | flag:"debug" |
envvar:"NAME" |
Override env var name | envvar:"DB_PASS" |
usage:"text" |
Flag usage/help text | usage:"enable debug logging" |
mapstructure:",squash" |
Squash embedded struct fields to parent level | see below |
ConfReader Builder API
config.NewConfReader("myapp") // create reader (config name = file name + env prefix base)
.WithSearchDirs("/etc/conf", "./") // override config file search dirs (default: home + current dir)
.WithPrefix("MYAPP") // prefix for env vars: MYAPP_DB_HOST
.Read(&cfg) // read and populate struct (returns error)
Watch for live config changes:
reader := config.NewConfReader("myapp")
err := reader.Read(&cfg)
mutex := reader.Watch() // call AFTER Read(); panics if called before
// thread-safe access:
mutex.RLock()
val := cfg.SomeField
mutex.RUnlock()
Config File
- File name:
<configName>.yaml(or.json,.toml,.hcl,.ini,.env,.properties) - Search order: home directory, then current directory (override with
WithSearchDirs) - Field name mapping: camelCase → lower camelCase YAML key
# For struct field DB.DbName:
db:
dbName: "mydb"
Environment Variables
- Default pattern:
FIELD_PATHwith dots replaced by_, uppercasedApp.Server.Port→APP_SERVER_PORT
- With prefix:
NewConfReader("x").WithPrefix("MYAPP")→MYAPP_APP_SERVER_PORT - Override with
envvartag:Password string \envvar:"DB_PASS"`→ reads fromDB_PASS`
Command-Line Flags
- Default pattern: lowercase dotted path with
--prefixApp.Server.Port→--app.server.port=8080
- Boolean flags: pass flag alone (no value needed):
--verbose - Override with
flagtag:Debug bool \flag:"debug"`→--debug` - Slices: repeat the flag:
--slice a --slice b - Byte slices: base64-encoded:
--bytes dGVzdA==
Complete Example
package main
import (
"fmt"
"time"
"github.com/num30/config"
)
type Config struct {
GlobalConfig `mapstructure:",squash"` // squash: fields promoted to top level
Debug bool
DB DatabaseConfig
DefaultVal string `default:"default value"`
Tags []string `default:"[\"a\",\"b\"]"`
}
type GlobalConfig struct {
Verbose bool `flag:"verbose" usage:"enable verbose logging"`
}
type DatabaseConfig struct {
Host string `default:"localhost" validate:"required"`
Password string `validate:"required" envvar:"DB_PASS"`
DbName string `default:"mydb"`
Username string `default:"root"`
Port int `default:"5432"`
Timeout time.Duration `default:"30s"`
}
func main() {
var cfg Config
err := config.NewConfReader("myapp").
WithSearchDirs("/etc/myapp", "./").
WithPrefix("MYAPP").
Read(&cfg)
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", cfg)
}
Squash Embedding
Use mapstructure:",squash" on an embedded struct to promote its fields to the parent level in config files and env vars:
type GlobalConfig struct { Verbose bool }
type AppConfig struct {
GlobalConfig `mapstructure:",squash"` // access as `verbose`, not `globalConfig.verbose`
Name string
}
Config file: verbose: true (not globalConfig.verbose: true)
Env var: VERBOSE=true (not GLOBAL_CONFIG_VERBOSE=true)
Supported Go Types
All primitive types are supported as config fields:
bool, int/int8/int16/int32/int64, uint/uint8/uint16/uint32/uint64, float32/float64, string, []string, []byte (base64 in flags/env), time.Duration
Validation
Uses go-playground/validator tags on struct fields:
type Config struct {
Host string `validate:"required"`
Port int `validate:"min=1,max=65535"`
Email string `validate:"required,email"`
}
Read() returns a validation error if constraints are violated. See validator docs for full tag list.
Built-in Config Structs (lib package)
import "github.com/num30/config/lib"
type Config struct {
DB lib.PostgresqlDb // provides Host, Password, DbName, Username, Port, SslEnabled with sane defaults
}
// Get connection string:
connStr := cfg.DB.GetConnString()
// → "host=localhost user=postgres password=pass database= port=5432 sslmode=disable"
lib.PostgresqlDb defaults: Host:"localhost", Password:"pass", Username:"postgres", Port:5432, SslEnabled:false
Slices
type Config struct {
Slice []string
}
| Source | Format |
|---|---|
| Env var | SLICE=a,b,c |
| Config file | slice: ["a", "b", "c"] |
| CLI flags | --slice a --slice b |
Error Handling
Read() returns errors for:
- Nil or non-pointer config struct
- Config file parse failures (
"failed to unmarshal struct") - Default value failures (
"failed to set default values") - Validation failures (
"validation error: Key: '...' Error:...")
Watch() panics if called before Read().
Additional References
- references/api.md — Full API reference
- references/examples.md — Real-world usage examples