reflect.Typeとreflect.Value
TypeOf、ValueOf、Kind、Elem
「reflect.Typeとreflect.Value」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
reflect パッケージの概要
reflect パッケージを使うと、Go プログラムは実行時に型と値を調べられます。これはエンコーディングライブラリ、ORM、依存性注入フレームワークの基盤です。
reflect.TypeOf
reflect.TypeOf(x) は、x の値の reflect.Type を返します:
t := reflect.TypeOf(42)
fmt.Println(t.Name()) // "int"
fmt.Println(t.Kind()) // "int"
fmt.Println(t.String()) // "int"reflect.ValueOf
reflect.ValueOf(x) は x を保持する reflect.Value を返します。Kind に対応したメソッドで値を読み取れます:
v := reflect.ValueOf(42)
fmt.Println(v.Kind()) // "int"
fmt.Println(v.Int()) // 42Type.Kind と Type.Name の違い
Kind は基盤となる Go のカテゴリ(int、struct、ptr、slice など)です。Name は宣言された型名("MyStruct")です。インターフェースの Kind は Interface ですが、Name はありません。
構造体フィールド
Type.NumField() と、reflect.StructField を返す Type.Field(i) で構造体のフィールドを調べます:
t := reflect.TypeOf(User{})
for i := 0; i < t.NumField(); i++ {
f := t.Field(i)
fmt.Printf("Field: %s Type: %s Tag: %s\n", f.Name, f.Type, f.Tag.Get("json"))
}構造体フィールド値の読み取り
Value.FieldByName または Value.Field(i) を使用して、実行時にフィールドの値を読み取ります:
v := reflect.ValueOf(user)
nameField := v.FieldByName("Name")
fmt.Println(nameField.String()) // "Alice"構造体フィールド値の設定
フィールドを設定するには、値がアドレス指定可能でなければなりません(ポインターとして渡します):
v := reflect.ValueOf(&user).Elem()
v.FieldByName("Name").SetString("Bob")ポインターの間接参照
値がポインターの場合は、v.Elem() を呼び出してポインターが指す値を取得します。先に v.Kind() == reflect.Ptr を確認してください。
if v.Kind() == reflect.Ptr {
v = v.Elem()
}reflect.New
型の新しいゼロ値を作成し、そのポインターを取得します:
t := reflect.TypeOf(User{})
ptr := reflect.New(t) // *User
user := ptr.Interface().(*User)メソッドの呼び出し
リフレクションで取得した値に対して、名前を指定してメソッドを呼び出します:
v := reflect.ValueOf(user)
m := v.MethodByName("Greet")
results := m.Call(nil)
fmt.Println(results[0].String())パフォーマンス
リフレクションは直接記述したコードより 5~10 倍遅くなります。ホットループの外側で reflect.Type と reflect.Value の検索結果をキャッシュしてください。パフォーマンスが重要な場合はコード生成を使用します。
確認問題
reflect.Type.Kind() と reflect.Type.Name() の違いは何ですか?
まとめ: reflect.Type と reflect.Value
重要なポイント:
- 実行時の型検査には reflect.TypeOf と reflect.ValueOf を使用する
- Kind は基盤となるカテゴリ、Name は宣言された名前を表す
- 構造体フィールドの操作には Value.FieldByName と SetXxx を使用する
- 設定可能な値にはポインターを渡して Elem() を呼び出す
よくある質問
「reflect.Typeとreflect.Value」レッスンは無料ですか?
はい。「reflect.Typeとreflect.Value」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「reflect.Typeとreflect.Value」で何を学びますか?
TypeOf、ValueOf、Kind、Elem ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「reflect.Typeとreflect.Value」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- reflect.Typeとreflect.Value
- 構造体フィールドとタグの調査
- 動的な関数呼び出し
- 実践リフレクション:シリアライザー