Go 言語のリフレクションは、reflect パッケージを通じて実装されたイントロスペクション メカニズムであり、プログラムが独自の構造、フィールド、およびメソッドを検査および変更できるようにします。リフレクションを使用すると、型と値のリフレクション オブジェクトの取得、型の検査、フィールドへのアクセスと変更、メソッドの呼び出しを行うことができます。実際のアプリケーションの 1 つは、リフレクションを使用して、合計の例の Number インターフェイスなど、特定のインターフェイスを実装するさまざまな型に対して統一された操作を実行することです。
Go 言語のリフレクション: 賢い使い方
リフレクションは、プログラムがそれ自体の構造を調べて変更できるようにする内省メカニズムです。フィールドとメソッド。 Go 言語では、リフレクションは reflect
パッケージを通じて実装されます。
基本的な使用法
リフレクションの基礎は、型 reflect.Type
と値 reflect.Value
です。 reflect.Type
は Go タイプを表し、reflect.Value
は特定の値を表します。型の reflect.Type
を取得するには、reflect.TypeOf()
関数を使用します。
type Person struct { Name string Age int } p := Person{"John", 30} typ := reflect.TypeOf(p)
reflect.Value# を取得するには値 # の #、
reflect.ValueOf() 関数を使用できます:
v := reflect.ValueOf(p)
型を確認します
リフレクションを使用すると、確認できます値のタイプ:fmt.Println(typ.Name()) // 输出: Person fmt.Println(v.Kind()) // 输出: struct
アクセス フィールド
reflect.Value.Field() メソッドを使用して、次のフィールドにアクセスできます。構造。このメソッドは、フィールドの値を示す
reflect.Value を返します。
nameField := v.FieldByName("Name") fmt.Println(nameField.String()) // 输出: John
フィールドを変更します
throughreflect.Value .Set( ) メソッドを使用して、構造体のフィールドを変更することもできます。
nameField.SetString("Alice") fmt.Println(p.Name) // 输出: Alice
メソッド呼び出し
Reflection ではメソッドを呼び出すこともできます。reflect.Value.Method() メソッドを使用してメソッド オブジェクトを取得し、
reflect.Method.Call() メソッドを使用してそれを呼び出します:
ageMethod := v.MethodByName("GetAge") result := ageMethod.Call([]reflect.Value{}) fmt.Println(result[0].Int()) // 输出: 30
実践的な戦闘ケース
以下はリフレクションを使用した実際のケースです:type Number interface { Int() int } func Sum(numbers []Number) int { total := 0 v := reflect.ValueOf(numbers) for i := 0; i < v.Len(); i++ { total += v.Index(i).MethodByName("Int").Call([]reflect.Value{})[0].Int() } return total } type IntNumber int func (n IntNumber) Int() int { return int(n) } type FloatNumber float64 func (n FloatNumber) Int() int { return int(n) } func main() { numbers := []Number{IntNumber(4), FloatNumber(5.3), IntNumber(6)} fmt.Println(Sum(numbers)) // 输出: 15 }このケースでは、
Number インターフェイスといくつかの型を定義します。それを実装するもの。
Sum() 関数は、リフレクションを使用してスライス内の
Number 型のすべての値に対して
Int() メソッドを呼び出し、結果を合計します。
以上がGo 言語におけるリフレクションの賢い使い方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。