ホームページ >バックエンド開発 >Golang >Go 構造体の大文字フィールドのみがパッケージ外からアクセスできるのはなぜですか?また、JSON マーシャリングやデータベース インタラクションに小文字フィールドを含めるにはどうすればよいですか?

Go 構造体の大文字フィールドのみがパッケージ外からアクセスできるのはなぜですか?また、JSON マーシャリングやデータベース インタラクションに小文字フィールドを含めるにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-02 05:25:12501ブラウズ

Why are only capitalized fields in Go structs accessible outside the package, and how can I include lowercase fields in JSON marshaling and database interactions?

Go 構造体のフィールドの可視性を理解する

Go で構造体を操作する場合、開発者は、識別子が大文字のフィールドのみにアクセスできるという問題によく遭遇します。現在のパッケージの外にあります。これは、構造体をデータベースに保存する場合、または構造体を JSON にマーシャリングする場合に特に問題となる可能性があります。

提供されたコード スニペットでは、Person 構造体と Sample 構造体に大文字と小文字の両方の識別子を持つフィールドが含まれています。ただし、CouchDB データベースと対話するとき、またはサンプル構造体を JSON に変換するときは、大文字の識別子を持つフィールドのみが含まれます。

この動作は、小文字で始まる識別子のみが含まれることを規定する Go の可視性ルールに基づいています。現在のパッケージ内で表示されます。 JSON エンコーダと CouchDB クライアントは別のパッケージにあるため、構造体内の小文字の識別子を持つフィールドに直接アクセスできません。

解決策: JSON タグを使用する

解決するにはこの制限のために、Go は「JSON タグ」と呼ばれるメカニズムを提供します。 JSON タグを使用すると、JSON マーシャリングおよびアンマーシャリング中に構造体フィールドをエンコードおよびデコードする方法を指定できます。小文字の識別子を持つフィールドに JSON タグを追加すると、JSON エンコーダーでそれを認識できるようになります。

例:

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

この更新されたコードでは、名前と年齢フィールドは両方とも json ディレクティブでタグ付けされています。これにより、age が小文字で始まる場合でも、マーシャリング中に両方のフィールドを含めるように JSON エンコーダーに指示されます。

CouchDB への拡張

一方、CouchDB アクセス用に指定されたライブラリは、 JSON タグを明示的にサポートしていない場合でも、Go 標準ライブラリの JSON エンコード機能を利用して、目的の結果を達成することができます。以下は、タグ付きフィールドを使用した PostDocument 関数の修正バージョンです。

func (db *Database) PostDocument(v interface{}) (*Document, error) {
    b, err := json.Marshal(v)
    if err != nil {
        return nil, err
    }

    resp, err := db.httpClient.Post(db.URL+db.name+"/", "application/json", bytes.NewReader(b))
    if err != nil {
        return nil, err
    }

    defer resp.Body.Close()
    return decodeDocument(resp.Body)
}

データベースに投稿する前に json.Marshal 関数を使用して構造体を JSON に変換すると、タグ付きフィールドが正しくエンコードされます。

結論

Go のフィールド可視性ルールとパッケージの境界を越えて構造体を操作する場合、JSON タグを活用することが重要です。これらの原則を適用すると、データ交換中にすべてのフィールドにアクセスでき、適切にシリアル化されることを保証できます。

以上がGo 構造体の大文字フィールドのみがパッケージ外からアクセスできるのはなぜですか?また、JSON マーシャリングやデータベース インタラクションに小文字フィールドを含めるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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