Golang は、コンパイル時に型を知らなくても、変数を更新し、実行時に値を表示し、メソッドを呼び出し、レイアウトを直接変更するメカニズムを提供します。反射といいます。
リフレクションを使用する理由 (推奨学習: go)
たとえば、さまざまなタイプの値を処理できる関数が必要になる場合があります。タイプがわからない場合は、次のように書くかもしれません:
// 伪代码 switch value := value.(type) { case string: // ...一些操作 case int: // ...一些操作 case cbsStruct: // 自定义的结构体 // ...一些操作 // ... }
何か問題は見つかりましたか?
ここには問題があります。多くの型があり、この関数を記述するのは非常に長くなります。また、カスタム型も存在する可能性があるため、将来的にはこの判断を変更する必要がある可能性があります。 、値がどの型に属するかを知る方法がないためです。
未知の型を見分けることができない場合、上記のコードは実際にはあまり合理的ではありません。現時点では、それに対処するためにリフレクションが必要です。リフレクションは TypeOf 関数と ValueOf 関数を使用して、未知の型の情報を取得します。インターフェイスからターゲットオブジェクトを選択し、目的を簡単に完了します。
3. リフレクションでは具体的に何ができるのでしょうか?
package main import ( "fmt" "reflect" ) func main() { var name string = "咖啡色的羊驼" // TypeOf会返回目标数据的类型,比如int/float/struct/指针等 reflectType := reflect.TypeOf(name) // valueOf返回目标数据的的值,比如上文的"咖啡色的羊驼" reflectValue := reflect.ValueOf(name) fmt.Println("type: ", reflectType) fmt.Println("value: ", reflectValue) }
Golang では、リフレクションをサポートするための Reflect パッケージが提供されており、主なものとしては、取得と操作に使用される 2 つのメソッドと 2 つの構造体 (正確には構造体とインターフェース) が含まれます。インターフェイス変数の型と動的値。
2 つのメソッド:
func TypeOf(i インターフェイス{}) Type {...} このメソッドは、空のインターフェイス タイプ Variables を受け取ります。実際のパラメータはコピーされて空のインターフェイス変数に変換され、最終的に TypeOf のパラメータとして使用されます。
関数内では、インターフェース変数の動的型情報を取り出し、reflect.Typeにカプセル化して返しますが、reflect.Typeはインターフェースなので、実際に使用されるのはインターフェースのインスタンスです。ここでの実際のインスタンスは、reflect.rtype です。
func ValueOf(i Interface{}) Value {...} TypeOf 関数型では、コピーも受け取り、それを空のインターフェイス変数に変換し、メソッド内のインターフェイス変数を出力します。動的値はカプセル化され、reflect.Value オブジェクトとして返されます。
以上がgolang ではリフレクションが重要ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。