ホームページ  >  記事  >  バックエンド開発  >  golang構造強制転送の詳細な紹介

golang構造強制転送の詳細な紹介

PHPz
PHPzオリジナル
2023-03-30 09:08:011913ブラウズ

Go 言語では、構造体は非常に一般的なデータ型です。構造体は型のセットによって定義されたコレクションであり、各構造体には、それぞれ独自の名前と型を持つ複数のフィールドを含めることができます。実際の開発では、ある構造体型を別の構造体型に強制的に変換する構造体型変換がよく使われます。次に、この記事では、golang 構造の強制転送について詳しく説明します。

Golang の構造体の型強制には、主に以下の 3 つの方法があります。

方法 1: 型アサーションを使用する

Go 言語では、型アサーション (Type Assertion) を使用して実装できます。構造型の強制。型アサーションを使用すると、インターフェイス変数に格納されている値が特定の型であるかどうかを判断したり、インターフェイス型を他の型に変換したりできます。以下に例を示します。

type Person struct {
    Name string
    Age  int
}

type Student struct {
    Name string
    Age  int
    Grade int
}

func main() {
    var p Person
    p.Name = "张三"
    p.Age = 22

    // 转换为Student类型
    s, ok := interface{}(&p).(*Student)
    if ok {
        fmt.Println(s.Name, s.Age, s.Grade)
    } else {
        fmt.Println("类型转换失败")
    }
}

上記のコードでは、Person タイプの構造体 p を Student タイプの構造体にキャストしています。 p は実際には Person 型の構造体であるため、変換操作は失敗します。パニックを避けるため、強制型変換を行う際に型変換の結果が成功したかどうかも判定し、成功した場合は変換後の新しいオブジェクトを返し、そうでない場合は nil を返す ok-idiom メソッドを使用します。

方法 2: json に変換してからターゲット構造体に変換する

型変換に型アサーションを使用するだけでなく、json のシリアル化と逆シリアル化を使用して構造型の強制変換を実装することもできます。具体的な手順は次のとおりです。

  1. ソース オブジェクトを json 文字列にシリアル化します。
  2. json 文字列をターゲット オブジェクトに逆シリアル化すると、変換が完了します。
type Person struct {
    Name string
    Age  int
}

type Student struct {
    Name string
    Age  int
    Grade int
}

func main() {
    var p Person
    p.Name = "张三"
    p.Age = 22

    // 转换为Student类型
    b, _ := json.Marshal(&p)
    var s Student
    json.Unmarshal(b, &s)
    fmt.Println(s.Name, s.Age, s.Grade)
}

上記のコードでは、Person タイプの構造体 p を Student タイプの構造体にキャストしています。まず、json.Marshal() 関数を使用してソース オブジェクト p を json 文字列 b に変換し、次に json.Unmarshal() 関数を使用して json 文字列 b をターゲット オブジェクト s に逆シリアル化します。 json.Unmarshal() 関数はエラーを返さないため、型変換が成功したかどうかを判断する必要はありません。

方法 3: 直接バイト コピー

型変換に型アサーションと JSON シリアル化および逆シリアル化を使用することに加えて、バイトを直接コピーすることもできます。具体的な手順は次のとおりです。

  1. まず、ソース構造をシリアル化してバイト スライスを取得します。
  2. バイトスライスをターゲット構造にコピーします。
  3. ターゲット構造体を逆シリアル化すると、変換が完了します。
type Person struct {
    Name string
    Age  int
}

type Student struct {
    Name string
    Age  int
    Grade int
}


func main() {
    var p Person
    p.Name = "张三"
    p.Age = 22

    // 转换为Student类型
    var s Student
    b, _ := json.Marshal(&p)
    copy((*(*[1 << 20]byte)(unsafe.Pointer(&s)))[:], b)
    fmt.Println(s.Name, s.Age, s.Grade)
}

上記のコードでは、Person タイプの構造体 p を Student タイプの構造体にキャストしています。まず、json.Marshal() 関数を使用してソース構造体 p をバイト配列 b に変換し、次に copy() 関数を使用してバイト配列 b をターゲット構造体のメモリ空間にコピーします。 use json .Unmarshal() 関数は、ターゲット構造体を逆シリアル化して型変換を完了します。

結論:

上記 3 つの方法はいずれも構造体の型変換を実現できますが、実際の開発では、必要に応じて適切な方法を選択する必要があります。ポインタ型の構造変換を使用する場合、ポインタ値のディープコピーや型の正確さなどの問題に特別な注意を払う必要があることに注意してください。

以上がgolang構造強制転送の詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。