golang では、インターフェイスと構造は 2 つの一般的なデータ型です。インターフェイスは実装を行わずに一連のメソッドを定義する抽象型であるのに対し、構造体はデータを整理して保存するために使用される具象型です。実際の開発ではインターフェースを構造体に変換する必要がある場合がありますが、この記事では golang でインターフェースを構造体に変換する 2 つの方法を紹介します。
1. リフレクションを使用してインターフェースを構造体に変換する
golang では、リフレクションを使用してインターフェースを構造体に変換する操作を完了できます。リフレクションは、変数の値、型、属性などの情報を実行時に動的に読み取り、変更できる強力なメカニズムです。リフレクションで一般的に使用されるものには、reflect.Value と Reflect.Type があります。
具体的な実装手順は次のとおりです。
type Person struct { Name string Age int }
type PersonInterface interface { GetName() string GetAge() int }
func ConvertInterfaceToStruct(p PersonInterface) (Person, error) { var person Person value := reflect.ValueOf(p) if value.Kind() == reflect.Ptr && !value.IsNil() { value = value.Elem() if value.Kind() == reflect.Struct { person.Name = value.FieldByName("Name").String() person.Age = int(value.FieldByName("Age").Int()) return person, nil } } return person, fmt.Errorf("invalid type:%v", reflect.TypeOf(p)) }
この関数では、最初にインターフェイスの型をリフレクション値 (reflect.Value) に変換し、次に値がポインター型であり null ではないかどうかを判断します。次に、ポインタ型が構造型に変換され、リフレクションによって Name フィールドと Age フィールドの値が取得され、最後に person 構造型が返されます。
func main() { p := &Person{Name: "Tom", Age: 20} fmt.Println(p) if ps, err := ConvertInterfaceToStruct(p); err != nil { log.Fatal(err) } else { fmt.Println(ps) } }
このテスト コードでは、パーソン構造体ポインターを作成し、実装された ConvertInterfaceToStruct 関数を使用してポインター型を パーソン 構造体型に変換し、結果を出力します。
2. json を使用してインターフェイスを実装し、それを構造体に変換します
golang では、json は一般的なデータ形式です。json.Marshal( を通じてオブジェクトを json 文字列にシリアル化できます。 json.Unmarshal() を使用して、json 文字列をオブジェクトに逆シリアル化することもできます。
具体的な実装手順は次のとおりです。
type Person struct { Name string `json:"name,omitempty"` Age int `json:"age,omitempty"` }
この構造では、変換を実現するために、json フィールド名がインターフェイス内のフィールド名と一致するように指定されています。
type PersonInterface interface { GetName() string GetAge() int }
func ConvertInterfaceToStruct(p PersonInterface) (Person, error) { jsonStr, err := json.Marshal(p) if err != nil { return Person{}, err } var person Person err = json.Unmarshal(jsonStr, &person) if err != nil { return Person{}, err } return person, nil }
この関数では、まず json.Marshal() を使用してインターフェース型を json 文字列に変換し、次に json.Unmarshal() を使用してそれを Person 構造型に変換します。そして構造体を返します。
func main() { p := &Person{Name: "Tom", Age: 20} fmt.Println(p) if ps, err := ConvertInterfaceToStruct(p); err != nil { log.Fatal(err) } else { fmt.Println(ps) } }
このテスト コードでは、パーソン構造体ポインターを作成し、実装された ConvertInterfaceToStruct 関数を使用してポインター型を パーソン 構造体型に変換し、結果を出力します。
概要:
上記の 2 つのメソッドは両方とも、実装に異なるメソッドを使用して、インターフェイスの型を構造型に変換できます。リフレクション メソッドの実装は比較的低レベルであり、型が必要ですjson メソッドは比較的シンプルで明確ですが、golang では json のシリアル化メソッドと逆シリアル化メソッドを使用するだけで済みます。さまざまな方法の選択は、実際のニーズやパフォーマンスなどの要因によって異なります。
以上が構造体への golang インターフェイスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。