ホームページ  >  記事  >  バックエンド開発  >  Golangで構造体変換を行う方法

Golangで構造体変換を行う方法

PHPz
PHPzオリジナル
2023-03-22 16:31:492096ブラウズ

Golang 言語は、可読性と保守性が高いオブジェクト指向プログラミング言語です。ほとんどの開発者にとって、開発には Golang を使用する方が便利で高速です。 Golang では、struct は非常に一般的なデータ型であり、オブジェクトの一連の属性を表すことができます。実際の開発では構造体間の変換が必要になることが多いのですが、今回はGolangがどのように構造体変換を行うのかを学びます。

構造の定義

まず、構造を定義しましょう:

type Person struct {
    Name    string
    Age     int
    Address Address
}

type Address struct {
    Province string
    City     string
    Street   string
}

上のコードでは、Body という 2 つの構造を定義しました。1 つは person です。名前、年齢、住所の 3 つの属性が含まれます。ここで、住所はネストされた構造です。

構造を JSON に変換する

実際の開発では、構造を JSON 形式に変換する必要があることがよくあります。 Golang の組み込みの encoding/json パッケージは便利な JSON エンコードおよびデコード機能を提供しており、このパッケージを使用して構造体を JSON 形式のデータに変換できます。

import "encoding/json"

func main() {
    person := Person{Name: "Tom", Age: 18, Address: Address{Province: "Beijing", City: "Beijing", Street: "Wudaokou"}}
    jsonBytes, err := json.Marshal(person)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(string(jsonBytes))
}

上記のコードでは、まず Person インスタンスを作成し、次に json.Marshal() を呼び出してインスタンスを JSON 形式のデータに変換します。変換処理中にエラーがあった場合はエラーメッセージが出力され、そうでない場合は変換結果の文字列が出力されます。

JSON を構造体に変換する

構造体を JSON 形式に変換することに加えて、多くの場合、JSON 形式のデータを構造体に変換する必要があります。上の例では人物をJSON形式に変換しましたが、次にJSONデータを構造体に変換してみましょう。

jsonStr := `{"Name":"Tom","Age":18,"Address":{"Province":"Beijing","City":"Beijing","Street":"Wudaokou"}}`
person := Person{}
err := json.Unmarshal([]byte(jsonStr), &person)
if err != nil {
    fmt.Println(err)
}
fmt.Println(person)

上記のコードでは、最初に JSON 形式のデータを jsonStr として定義し、次に json.Unmarshal() を呼び出して Person 構造体に変換します。同様に、変換処理中にエラーが発生した場合はエラーメッセージが出力され、それ以外の場合は変換後のパーソン構造体のインスタンスが出力されます。

フィールド変換

データのフィールド名が構造内のフィールド名と一致しない場合があり、この場合はフィールド変換が必要です。 Golang では、構造体の属性名を Tag に変更することでこれを実現できます。

type Person struct {
    Name    string `json:"name"`
    Age     int    `json:"age"`
    Address Address
}

type Address struct {
    Province string `json:"province"`
    City     string `json:"city"`
    Street   string `json:"street"`
}

上記のコードでは、JSON 属性名を指定する json タグを構造属性名の前に追加しました。変換プロセス中、タグが存在する場合は、タグが優先されます。

構造内に配列があります

構造内には、配列を含む属性が存在する可能性があります。この場合、配列を走査する必要があります。

type Person struct {
    Name    string    `json:"name"`
    Age     int       `json:"age"`
    Address []Address `json:"address"`
}

type Address struct {
    Province string `json:"province"`
    City     string `json:"city"`
    Street   string `json:"street"`
}

func main() {
    jsonStr := `{"name":"Tom","age":18,"address":[{"province":"Beijing","city":"Beijing","street":"Wudaokou"},{"province":"Henan","city":"Kaifeng","street":"Longting"}]}`
    person := Person{}
    err := json.Unmarshal([]byte(jsonStr), &person)
    if err != nil {
        fmt.Println(err)
    }
    for _, a := range person.Address {
        fmt.Println(a.Province, a.City, a.Street)
    }
}

上記のコードでは、Person 構造体に Address の配列が含まれており、これを走査する必要があります。変換プロセス中に、Unmarshal を使用して JSON 形式のデータを Person 構造インスタンスに変換し、次に Address 配列を走査して、各 Address インスタンスの都道府県、市区町村、および番地属性を出力できます。

概要

Golang では、構造体の変換は比較的頻繁に行われる操作です。この記事の導入を通じて、Golang が構造体と JSON を相互に変換する方法を学びました。フィールド変換や配列トラバーサルなどの一部の特殊なケースでは、より深い理解と操作が必要です。 Golang の構造体変換機能により、開発がより便利かつ迅速になります。

以上がGolangで構造体変換を行う方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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