2014-06-14 53 views
13

我對Go等類型化語言有些新鮮,並且正在嘗試學習實現事物的最佳方式。golang中空或不需要結構字段

我有兩個結構體,表示將被插入到mongodb數據庫中的模型。一個結構(投資)具有其他結構(組)作爲其領域之一。

type Group struct { 
    Base 
    Name string `json:"name" bson"name"` 
} 

type Investment struct { 
    Base 
    Symbol string `json:"symbol" bson:"symbol" binding:"required"` 
    Group Group `json:"group" bson:"group"` 
    Fields bson.M `json:"fields" bson:"fields"` 
} 

我遇到的問題是在投資模式中,組不是必需的。如果沒有組,我認爲它更好,因爲它不會插入數據庫。在Go中處理db模型的最佳方式是什麼?

+0

這不是我的專業領域,但你可能想調查'json.Marshaler' http://golang.org/pkg/encoding/json/#Marshaler它可以讓你爲json定義自定義的封送行爲,這應該是(有一些努力)可以讓你不寫一個基於某種邏輯的給定字段。 – LinearZoetrope

+0

結構標籤:'json:「omitempty」'應該從內存中訣竅。 – elithrar

回答

19

TL;博士:使用,omitempty,如果你需要擔心zero value,而不是指定的空/,do what the GitHub API does and use a pointer之間的差異。


兩個jsonbson支持,omitempty標籤。對於json,「空值是假的,0,任何零指針或接口值,以及任何數組,片段,映射,或長度爲零的字符串」(json docs)。對於bson,,omitempty的意思是「只有包含字段(如果未將該字段設置爲該類型的零值或空片或映射)」,並且包含空字符串和零指針(bson docs)。

所以,如果你真的需要一個組結構,你可以把一個*Group代替,並且當指針爲零時它不會被存儲。如果Investment只需要保存該組的名稱,它甚至更簡單:""作爲組名保留組密鑰。

bson默認爲已經使用小寫字段名稱,因此您可以在匹配時從struct標記中省略。 json將默認爲大寫字母的名稱,因此如果您需要小寫字母,請在標記中指定小寫字母的名稱。

所以,最好的情況下,也許你可以使用:

type Investment struct { 
    Base 
    Symbol string `json:"symbol" binding:"required"` 
    Group string `json:"group,omitempty" bson:",omitempty"` 
    Fields bson.M `json:"fields"` 
} 

如果你碰上領域,其中用於類型(「零值」,0,假,等)是有別於「未指定「,您可以do what the GitHub API does and put pointers in your structures - 實質上是*Group技巧的擴展。

+0

不是Mongo用戶,如果它錯了,請糾正我。已經閱讀GitHub的帖子,瞭解關於可忽略字段的指針以及提示',omitempty'的評論,並挖掘相關文檔,並且看起來好像會起作用。 – twotwotwo

+0

您不需要在標記中爲JSON字段指定小寫字母的名稱。根據文檔:爲了將JSON解組到一個結構中,Unmarshal將傳入的對象關鍵字匹配到Marshal使用的關鍵字(結構字段名稱或其標記),並且首選精確匹配,但也接受不區分大小寫的匹配。 ''' – mlg