構造体への golang インターフェイス

PHPz
リリース: 2023-05-10 11:12:36
オリジナル
3639 人が閲覧しました

golang では、インターフェイスと構造は 2 つの一般的なデータ型です。インターフェイスは実装を行わずに一連のメソッドを定義する抽象型であるのに対し、構造体はデータを整理して保存するために使用される具象型です。実際の開発ではインターフェースを構造体に変換する必要がある場合がありますが、この記事では golang でインターフェースを構造体に変換する 2 つの方法を紹介します。

1. リフレクションを使用してインターフェースを構造体に変換する

golang では、リフレクションを使用してインターフェースを構造体に変換する操作を完了できます。リフレクションは、変数の値、型、属性などの情報を実行時に動的に読み取り、変更できる強力なメカニズムです。リフレクションで一般的に使用されるものには、reflect.Value と Reflect.Type があります。

具体的な実装手順は次のとおりです。

  1. データをインターフェイスに保存するための構造体タイプを作成します。例:
type Person struct {
    Name string
    Age  int
}
ログイン後にコピー
  1. データを構造体に変換するインターフェイス タイプを作成します。例:
type PersonInterface interface {
    GetName() string
    GetAge() int
}
ログイン後にコピー
ログイン後にコピー
  1. インターフェイス型を構造型に変換する関数を実装します。例:
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 構造型が返されます。

  1. main関数でテストします。例:
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 文字列をオブジェクトに逆シリアル化することもできます。

具体的な実装手順は次のとおりです。

  1. データをインターフェイスに保存するための構造体タイプを作成します。例:
type Person struct {
    Name string `json:"name,omitempty"`
    Age  int    `json:"age,omitempty"`
}
ログイン後にコピー

この構造では、変換を実現するために、json フィールド名がインターフェイス内のフィールド名と一致するように指定されています。

  1. データを構造体に変換するためのインターフェイス タイプを作成します。例:
type PersonInterface interface {
    GetName() string
    GetAge() int
}
ログイン後にコピー
ログイン後にコピー
  1. インターフェイス型を構造体型に変換する関数を実装します。例:
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 構造型に変換します。そして構造体を返します。

  1. main関数でテストします。例:
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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!