0Pricing
Go Academy · レッスン

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())     // 42

Type.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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. reflect.Typeとreflect.Value
  2. 構造体フィールドとタグの調査
  3. 動的な関数呼び出し
  4. 実践リフレクション:シリアライザー
← Go Academyに戻る