2017-07-17 112 views
1

我正在Golang寫一個RESTful API,它也有一個gRPC API。 API連接到MongoDB數據庫,並使用結構來映射實體。我也有一個.proto的定義,就像我用於MongoDB的結構一樣。將protoc生成的結構體從bson結構體轉換爲最佳方法是什麼?

我只是想知道是否有一種方法來共享,或重新使用MongoDB調用.proto定義的代碼也。我注意到protoc產生具有JSON標籤爲每個字段strucs,但顯然不會有bson標籤等

我有類似...

// Menu - 
type Menu struct { 
    ID   bson.ObjectId  `json:"id" bson"_id"` 
    Name  string    `json:"name" bson:"name"` 
    Description string    `json:"description" bson:"description"` 
    Mixers  []mixers.Mixer  `json:"mixers" bson:"mixers"` 
    Sections []sections.Section `json:"sections" bson:"sections"` 
} 

但是,我也有產生protoc代碼...

type Menu struct { 
    Id   string  `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"` 
    Name  string  `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` 
    Description string  `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"` 
    Mixers  []*Mixer `protobuf:"bytes,4,rep,name=mixers" json:"mixers,omitempty"` 
    Sections []*Section `protobuf:"bytes,5,rep,name=sections" json:"sections,omitempty"` 
} 

目前我不得不根據我在做什麼在兩個結構之間進行轉換。這是乏味的,我可能相當大的表現。那麼是否有更好的方法在兩者之間進行轉換,或者將兩個任務中的一個重新用於其中一個?

+0

可能只需手動添加'bson'標記。你是否試過它作爲測試?如果它可行,那麼你可以編寫一個腳本來處理它。 – RayfenWindspear

+0

使用'bson.ObjectId',你可以將兩者都放在struct(或embed)中,然後只要確保從任一源檢索到一個,就填充空的一個。我想這仍然暴露了一些單調乏味的工作,但不如轉換整個結構。 – RayfenWindspear

+0

問題是,我正計劃在構建或其他代碼上自動生成代碼,因此它會覆蓋它。我想我可以不這樣做,手動更新它,但感覺應該有一個標準的方式來做到這一點。當然,大量的人正在向Golang中的gRPC吐出mongodb查詢?嵌入ID實際上可以工作!你仍然很棘手,但你提到 –

回答

相關問題