Reflection は、型情報 (reflect.TypeOf による) と値情報 (reflect.ValueOf による) を含む型情報を検査および操作できる強力な Go メカニズムです。これは、JSON データのシリアル化などのさまざまなタスクに使用できます。リフレクションを使用して、構造体、スライス、または配列内のフィールドまたは要素を反復処理し、それらを JSON 文字列にシリアル化します。リフレクションを使用するとオーバーヘッドが発生し、プライベート フィールドにアクセスできなくなり、実行時エラーが発生する可能性があることに注意することが重要です。
リフレクションは、プログラムの実行時および動作時のチェックを可能にする Go 言語の強力なメカニズムです。タイプ情報。これにより、シリアル化、型チェック、汎用コードの生成などのタスクに最適になります。
各 Go タイプは、reflect.Type
値に関連付けられています。型情報を取得するには、reflect.TypeOf
関数を使用します。
type Person struct { Name string Age int } var person = Person{"John", 30} personType := reflect.TypeOf(person)
Reflection は値情報にもアクセスできます。値の情報を取得するには、reflect.ValueOf
関数を使用します。
value := reflect.ValueOf(person)
Reflection を使用して、JSON データをシリアル化できます。以下は例です:
func SerializeJSON(v interface{}) (string, error) { value := reflect.ValueOf(v) kind := value.Type().Kind() switch kind { case reflect.Struct: // 对于结构,遍历其字段并序列化每一个字段 fields := value.NumField() jsonStr := `{` for i := 0; i < fields; i++ { fieldValue := value.Field(i) jsonStr += ", " + SerializeJSON(fieldValue.Interface()) } jsonStr += "}" return jsonStr, nil case reflect.Slice, reflect.Array: // 对于切片或数组,遍历其元素并序列化每一个元素 length := value.Len() jsonStr := `[` for i := 0; i < length; i++ { jsonStr += ", " + SerializeJSON(value.Index(i).Interface()) } jsonStr += "]" return jsonStr, nil default: return json.Marshal(v) } }
リフレクションを使用する際に注意すべき点がいくつかあります:
以上がGo リフレクションのメカニズムが明らかにの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。