ホームページ > バックエンド開発 > Golang > Go から MongoDB にアクセスするときに型の不一致を処理するにはどうすればよいですか?

Go から MongoDB にアクセスするときに型の不一致を処理するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-11-19 11:43:03
オリジナル
640 人が閲覧しました

How to Handle Type Discrepancies When Accessing MongoDB from Go?

Go から MongoDB へのアクセス: カスタム データのマーシャリングとアンマーシャリング

Go を使用して MongoDB にアクセスすると、データベースのタイプは、Go 構造体で定義したものとは異なります。たとえば、MongoDB の日付フィールドは文字列として格納される場合がありますが、Go 構造体は time.Time 値を期待します。

これに対処するために、Go はカスタム データ マーシャリングおよびアンマーシャリング ロジックを実装する機能を提供します。このロジックをカスタマイズすると、MongoDB と Go 構造体間のデータ交換中に型変換を実行したり、特定の書式設定を適用したりできます。

カスタム ロジックを実装する 1 つの方法は、bson.Getter と bson を実装する独自の型を定義することです。 .Setter インターフェイス。これらのインターフェイスを使用すると、マーシャリングおよびアンマーシャリングのプロセスを制御できます。たとえば、 clientConfigData 型を、EndDate:

type clientConfigData struct {
    SMTPAssoc  int       `bson:"smtp_assoc"`
    PlanType   string    `bson:"plan_type"`
    EndDateStr string    `bson:"end_date"`
    EndDate    time.Time `bson:"-"`
}
ログイン後にコピー

という名前の time.Time 型の追加フィールドで拡張できます。bson:"-" タグは、EndDate フィールドを MongoDB に保持しないことを示します。

次に、カスタム マーシャリングとアンマーシャリングを処理するために GetBSON メソッドと SetBSON メソッドを実装します。

func (c *clientConfigData) SetBSON(raw bson.Raw) (err error) {
    type my clientConfigData
    if err = raw.Unmarshal((*my)(c)); err != nil {
        return
    }
    c.EndDate, err = time.Parse(endDateLayout, c.EndDateStr)
    return
}

func (c *clientConfigData) GetBSON() (interface{}, error) {
    c.EndDateStr = c.EndDate.Format(endDateLayout)
    type my *clientConfigData
    return my(c), nil
}
ログイン後にコピー

SetBSON() では、生データがカスタム タイプ my にアンマーシャリングされます。その後、EndDateStr フィールドが time.Time 値に解析され、EndDate に割り当てられます。

GetBSON() で、EndDateStr フィールドに EndDate から値が入力され、カスタム タイプ my が返されます。これは、データをマーシャリングして MongoDB に永続化する準備ができていることを示します。

このカスタム マーシャリングおよびアンマーシャリング ロジックを実装することで、MongoDB と Go 構造体の間の型の不一致を埋めることができ、MongoDB と Go 構造体の間でデータをシームレスに操作できるようになります。 2 つのプラットフォーム

以上がGo から MongoDB にアクセスするときに型の不一致を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート