Golang は、オブジェクト指向機能を備えた静的型付け言語です。リフレクションは、値の型を取得し、実行時にそれを操作する機能です。 Golang にはリフレクション メカニズムが組み込まれており、リフレクションを通じてオブジェクトの属性値を変更できます。この記事では、Golang のリフレクション設定に関する関連知識を紹介します。
まず、Golang で一般的に使用されるリフレクション タイプを理解する必要があります。 Golang では、リフレクション型 (reflect.Type) はインターフェイス型です。型名、型サイズ、配置、メソッド セットなど、オブジェクトの型情報を定義します。
Golang では、リフレクションを通じてオブジェクトの型情報を取得できます。たとえば、次のコードは変数 a の型情報を取得できます。
package main import ( "fmt" "reflect" ) func main() { var a = 10 t := reflect.TypeOf(a) fmt.Println("TypeOf a:", t) }
出力結果は次のとおりです。
TypeOf a: int
ご覧のとおり、 を通じて変数を取得しました。 reflect.TypeOf
関数 a の型。取得される結果は int
型です。
基本的な型に加えて、構造体、関数、ポインタなどの情報をリフレクションを通じて取得することもできます。たとえば、次のコードは構造体の型情報を取得できます。
package main import ( "fmt" "reflect" ) type Person struct { Name string Age int } func main() { var p = Person{"John", 30} t := reflect.TypeOf(p) fmt.Println("TypeOf p:", t) }
出力結果は次のとおりです。
TypeOf p: main.Person
ご覧のとおり、 を通じて構造体を取得しました。 reflect.TypeOf
関数 bodyperson
の型情報。
リフレクションの型に加えて、Golang にはリフレクション値 (reflect.Value) という概念もあります。反映された値は、オブジェクトの値と型情報を含むインターフェイス型です。 Golang では、リフレクションを通じてオブジェクトの値と型情報を取得できます。たとえば、次のコードは変数 a の値と型情報を取得できます:
package main import ( "fmt" "reflect" ) func main() { var a = 10 v := reflect.ValueOf(a) fmt.Println("ValueOf a:", v) fmt.Println("TypeOf a:", v.Type()) }
出力結果は次のとおりです:
ValueOf a: 10 TypeOf a: int
ご覧のとおり、## を通じて取得します。 #reflect.ValueOf 関数 変数 a の値と型情報を取得します。
package main import ( "fmt" "reflect" ) type Person struct { Name string Age int } func main() { var p = Person{"John", 30} v := reflect.ValueOf(p) fmt.Println("ValueOf p:", v) fmt.Println("TypeOf p:", v.Type()) }
ValueOf p: {John 30} TypeOf p: main.Person
関数 構造体 Person
の値と型情報を取得します。 3. リフレクション設定
メソッドを通じて取得できます。たとえば、次のコードは構造体の属性値を変更できます。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">package main
import (
"fmt"
"reflect"
)
type Person struct {
Name string
Age int
}
func main() {
var p = &Person{"John", 30}
v := reflect.ValueOf(p).Elem()
nameValue := v.FieldByName("Name")
nameValue.SetString("Tom")
fmt.Println(p)
}</pre><div class="contentsignin">ログイン後にコピー</div></div>
出力結果は次のとおりです。
&{Tom 30}
ご覧のとおり、
を通じて構造体を取得しました。 FieldByName リフレクション メソッド body 属性の値と Name
属性の値は、SetString
メソッドを使用して変更されました。 構造体の属性の値を変更することに加えて、リフレクションを通じて関数のパラメーター値を変更することもできます。たとえば、次のコードは関数のパラメータ値を変更できます:
package main import ( "fmt" "reflect" ) func Add(a, b int) int { return a + b } func main() { f := reflect.ValueOf(Add) args := []reflect.Value{reflect.ValueOf(10), reflect.ValueOf(20)} f.Call(args) fmt.Println("Before:", args) args[0] = reflect.ValueOf(100) args[1] = reflect.ValueOf(200) f.Call(args) fmt.Println("After:", args) }
出力結果は次のとおりです:
Before: [10 20] After: [100 200]
ご覧のとおり、リフレクションを通じて関数を呼び出しています
Callメソッド Add
そして関数のパラメータを変更しました。 4. 注意事項
以上がGolangのリフレクション設定の関連知識を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。