[Golang] Tags


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=""都會失敗.

#go, #golang #tag #JSON #bson #xml







你可能感興趣的文章

[ 筆記 ] JavaScript - 測試 Jest - TDD

[ 筆記 ] JavaScript - 測試 Jest - TDD

相見恨晚的 chrome 插件 — Octotree - GitHub code tree

相見恨晚的 chrome 插件 — Octotree - GitHub code tree

JavaScirpt - async/await

JavaScirpt - async/await






留言討論