STORY
在寫golang時, 可以針對struct中的data member做一些tag來達到一些特殊的效果
DESCRIPTION
type Demo struct {
Id string
Name string
}
在golang中, 開頭大寫表示public, 小寫則表示private,
當我們在寫網頁的時候, 有時候需要將如xml, json, bson等...資料轉為strcut,
這時候就需要使用tag來告訴decoder, 哪個key對應到哪一個data member
以上面的struct為例, 在沒有給tag的時候, 會以命名的名稱為marshal的key,
假設今天有個json 資料格式為 '{"identity":"A123", "name":"aaron"}'時,
在不改變原有struct的前提下, 可以將struct tag為以下:
type Demo struct {
Id string `json:"identity"`
Name string `json:"name"`
}
這樣就可以將, identity這個key對應到struct的id中.
另外有時會碰到一種情形, 當struct要轉json時,
我希望沒有被assign值的data member不要顯示, 如:'{"name":"aaron"}',
此時可以加入tag omitempty:
type Demo struct {
Id string `json:"identity,omitempty"`
Name string `json:"name"`
}
但其實我個人認為, omitempty不是很好用,
在golang中, 沒有被初始化的值, 都會有個default值,
如:bool為false, int為0, string為"", time為"0001-01-01T00:00:00Z"等...
omitempty就是抓你的值要是為default那麼就會被排除,
若要使用它, 請確保你的資料不會有default的狀況.
知道defualt值我覺得在golang算是蠻重要的,
比如在寫網頁時, 可以加上一些tag接收資料(以gin為例),
如: binding:"required", example:"content"
required表示該資料是必須的, 否則拒絕請求,
它的道理就與omitempty有點相關,
當接收到default值時, 代表你沒有輸入有效值到key中, 那麼請求就不回應.
也就表示我輸入int=0, bool=false, string=""都會失敗.