第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

使用 mongo-driver 自定義 BSON 編組和解組

使用 mongo-driver 自定義 BSON 編組和解組

Go
富國滬深 2022-07-11 16:28:21
我有一個(gè)像下面這樣的結(jié)構(gòu)字段。我還將相同結(jié)構(gòu)的原始 protobuf 存儲(chǔ)在 db 中?,F(xiàn)在每次都將數(shù)據(jù)獲取或保存到 mongo。ReallyBigRaw當(dāng)我想保存到數(shù)據(jù)庫時(shí),我必須從 proto更新,而當(dāng)我必須解組ReallyBigRaw以ReallyBigObj給出響應(yīng)時(shí),我必須解組。有沒有辦法我可以實(shí)現(xiàn)一些接口或提供一些回調(diào)函數(shù),以便 mongo 驅(qū)動(dòng)程序在保存或從 DB 獲取數(shù)據(jù)之前自動(dòng)執(zhí)行此操作。另外,我沒有使用官方的 golang mongo 驅(qū)動(dòng)程序mgo,我已經(jīng)閱讀了一些可以在mgogolang 庫中完成的答案。import (    "github.com/golang/protobuf/jsonpb"    "go.mongodb.org/mongo-driver/bson"    "go.mongodb.org/mongo-driver/bson/primitive"    proto "github.com/dinesh/api/go")type ReallyBig struct {    ID           string                 `bson:"_id,omitempty"`    DraftID      string                 `bson:"draft_id,omitempty"`// Marshaled ReallyBigObj proto to map[string]interface{} stored in DB    ReallyBigRaw map[string]interface{} `bson:"raw,omitempty"`    ReallyBigObj *proto.ReallyBig       `bson:"-"`    CreatedAt    primitive.DateTime     `bson:"created_at,omitempty"`    UpdatedAt    primitive.DateTime     `bson:"updated_at,omitempty"`}func (r *ReallyBig) GetProto() (*proto.ReallyBig, error) {    if r.ReallyBigObj != nil {        return r.ReallyBigObj, nil    }    Obj, err := getProto(r.ReallyBigRaw)    if err != nil {        return nil, err    }    r.ReallyBigObj = Obj    return r.ReallyBigObj, nil}func getRaw(r *proto.ReallyBig) (map[string]interface{}, error) {    m := jsonpb.Marshaler{}    b := bytes.NewBuffer([]byte{})    // marshals proto to json format    err := m.Marshal(b, r)    if err != nil {        return nil, err    }    var raw map[string]interface{}    // unmarshal the raw data to an interface    err = json.Unmarshal(b.Bytes(), &raw)    if err != nil {        return nil, err    }    return raw, nil}func getProto(raw map[string]interface{}) (*proto.ReallyBig, error) {    b, err := json.Marshal(raw)    if err != nil {        return nil, err    }    u := jsonpb.Unmarshaler{}    var reallyBigProto proto.ReallyBig    err = u.Unmarshal(bytes.NewReader(b), &recipeProto)    if err != nil {        return nil, err    }    return &reallyBigProto, nil}
查看完整描述

1 回答

?
繁星coding

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超4個(gè)贊

我實(shí)現(xiàn)了MarshalerandUnmarshaler接口。由于 mongo 驅(qū)動(dòng)程序調(diào)用MarshalBSON并且UnmarshalBSON如果類型實(shí)現(xiàn)Marshaler并且Unmarshaler我們也最終陷入無限循環(huán)。為了避免這種情況,我們創(chuàng)建了type. 別名Golang僅繼承字段而不是方法,因此我們最終調(diào)用正常bson.Marshal和bson.Unmarshal


func (r *ReallyBig) MarshalBSON() ([]byte, error) {

    type ReallyBigAlias ReallyBig

    reallyBigRaw, err := getRaw(r.ReallyBigObj)

    if err != nil {

        return nil, err

    }

    r.ReallyBigRaw = reallyBigRaw

    return bson.Marshal((*ReallyBigAlias)(r))

}


func (r *ReallyBig) UnmarshalBSON(data []byte) error {

    type ReallyBigAlias ReallyBig

    err := bson.Unmarshal(data, (*ReallyBigAlias)(r))

    if err != nil {

        return err

    }

    reallyBigProto, err := getProto(r.ReallyBigRaw)

    if err != nil {

        return err

    }

    r.ReallyBigObj = reallyBigProto

    return nil

}


查看完整回答
反對(duì) 回復(fù) 2022-07-11
  • 1 回答
  • 0 關(guān)注
  • 175 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)