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 サイトの他の関連記事を参照してください。