構造体フィールドとタグの調査
フィールドを反復処理し、構造体タグを読み取ります。
「構造体フィールドとタグの調査」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
StructField 型
reflect.StructField は構造体の 1 つのフィールドを表します。Name、Type、Tag、Index、Offset、Anonymous、IsExported が含まれます。
フィールドの反復処理
構造体型のすべてのフィールドをループ処理します:
t := reflect.TypeOf(struct{ ID int; Name string }{})
for i := 0; i < t.NumField(); i++ {
f := t.Field(i)
fmt.Println(f.Name, f.Type, f.IsExported())
}構造体タグの読み取り
タグには StructField.Tag.Get("key") でアクセスします:
type User struct {
ID int `json:"id" db:"user_id"`
Name string `json:"name,omitempty"`
}
f, _ := reflect.TypeOf(User{}).FieldByName("Name")
fmt.Println(f.Tag.Get("json")) // "name,omitempty"タグオプションの解析
タグにはカンマ区切りのオプションを含められます。strings.Split で解析します:
tag := f.Tag.Get("json") // "name,omitempty"
parts := strings.Split(tag, ",")
name := parts[0] // "name"
omitempty := len(parts) > 1 && parts[1] == "omitempty"FieldByName と FieldByIndex
名前またはインデックスでフィールドを検索します。FieldByName は構造体と埋め込み構造体に含まれるエクスポートされたフィールドを検索します:
f, ok := reflect.TypeOf(User{}).FieldByName("Name")
if ok { fmt.Println(f.Tag.Get("json")) }埋め込み構造体のフィールド
埋め込み構造体では、Anonymous が true になります。Type.FieldByIndex([]int{0,1}) を使用してネストされたフィールドにアクセスします。
非エクスポートフィールド
非エクスポート(小文字)のフィールドは型とタグを調べられますが、リフレクションで値を読み取ったり設定したりすることはできません。実行するとパニックになります。
フィールドキャッシュの構築
呼び出しのたびに構造体タグを解析するとコストがかかります。結果を reflect.Type をキーとする sync.Map にキャッシュします:
var fieldCache sync.Map
func getFields(t reflect.Type) []fieldInfo {
if v, ok := fieldCache.Load(t); ok { return v.([]fieldInfo) }
fields := parseFields(t)
fieldCache.Store(t, fields)
return fields
}ユースケース: シンプルな ORM
"db" タグを持つすべてのフィールドを走査し、INSERT のカラムリストを動的に構築します:
t := reflect.TypeOf(u)
v := reflect.ValueOf(u)
for i := 0; i < t.NumField(); i++ {
col := t.Field(i).Tag.Get("db")
val := v.Field(i).Interface()
// build query...
}ユースケース: 設定ローダー
"env" タグを持つ構造体フィールドを走査し、環境変数から値を設定します:
if env := f.Tag.Get("env"); env != "" {
if val := os.Getenv(env); val != "" {
v.Field(i).SetString(val)
}
}StructTag.Lookup
Tag.Lookup("key") はタグの値と、そのキーが存在していたかどうかを示すブール値を返します。Get とは異なり、存在しないキーに対して "" を返すだけではありません。
val, ok := f.Tag.Lookup("json")
if !ok { /* no json tag */ }確認問題
reflect.StructField から "json" 構造体タグの値を読み取るにはどうすればよいですか?
まとめ: 構造体フィールドとタグ
重要なポイント:
- フィールドメタデータには reflect.TypeOf → .NumField()、.Field(i) を使用する
- タグの値を読み取るには StructField.Tag.Get("key") を使用する
- 繰り返し解析しないよう、フィールドメタデータを sync.Map にキャッシュする
- タグが存在しない場合と空文字列の場合を区別する必要があるときは Tag.Lookup を使用する
よくある質問
「構造体フィールドとタグの調査」レッスンは無料ですか?
はい。「構造体フィールドとタグの調査」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「構造体フィールドとタグの調査」で何を学びますか?
フィールドを反復処理し、構造体タグを読み取ります。 ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「構造体フィールドとタグの調査」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- reflect.Typeとreflect.Value
- 構造体フィールドとタグの調査
- 動的な関数呼び出し
- 実践リフレクション:シリアライザー