golang中json和struct的使用說明
1、返回json響應(yīng)結(jié)果
在struct的字段后面加入json:"key"可以進行json格式輸出,其中key為json的鍵名
type SuccessResponse struct { Code int `json:"code"` Msg string `json:"msg"` Data interface{} `json:"data"` } func SuccessRsp(ctx *gin.Context, data interface{}) { res := SuccessResponse{ Code: 0, Msg: "success", Data: data, } ctx.JSON(http.StatusOK, res) } type MyData struct { Id int `json:"id"` Name string `json:"name"` } func ListAllOncallPlan(ctx *gin.Context) { //你的業(yè)務(wù)代碼 //...... data = Mydata{Id:1, Name:"zhangsan"} SuccessRsp(ctx, plans) } 響應(yīng)的結(jié)果為: { "code": 0, "msg": "ok", "data": { "id": 1, "name": "zhangsan" } }
tips:
1.如果struct的某個字段沒有傳值,則輸出的json為默認(rèn)值,可以通過"omitempty"參數(shù)忽略掉值為空的鍵
type MyData struct { Id int `json:"id,omitempty"` Name string `json:"name"` } data = Mydata{Name:"zhangsan"} SuccessRsp(ctx, plans)
則id的鍵會被忽略掉,輸出json為:
{ "code": 0, "msg": "ok", "data": { "name": "zhangsan" } }
2.可以用"-"來完全掉忽略掉某個鍵, 比如下面的id不會被轉(zhuǎn)化到j(luò)son字段中
type MyData struct { Id int `json:"-"` Name string `json:"name"` }
2、將數(shù)據(jù)庫的字段轉(zhuǎn)化成struct
如果使用gorm框架進行數(shù)據(jù)庫連接,則可以用gorm:"column:key"來指定數(shù)據(jù)庫的鍵,如下所示
type User struct { Id int64 `gorm:"column:id" json:"id"` Name string `gorm:"column:name" json:"name,omitempty"` }
補充:golang 一鍵生成 form,json,gorm標(biāo)簽
每次有新表產(chǎn)生時,就會有新的model,model編寫完后,繁雜的標(biāo)簽注解令人煩躁,所以寫了這樣的工具。
func AddJsonFormGormTag(in string) (string) { var result string scanner := bufio.NewScanner(strings.NewReader(in)) var oldLineTmp = "" var lineTmp = "" var propertyTmp = "" var seperateArr []string for scanner.Scan() { oldLineTmp = scanner.Text() lineTmp = strings.Trim(scanner.Text(), " ") if strings.Contains(lineTmp, "{") || strings.Contains(lineTmp, "}") { result = result + oldLineTmp + "\n" continue } seperateArr = Split(lineTmp, " ") // 接口或者父類聲明不參與tag, 自帶tag不參與tag if len(seperateArr) == 1 || len(seperateArr) == 3 { continue } propertyTmp = HumpToUnderLine(seperateArr[0]) oldLineTmp = oldLineTmp + fmt.Sprintf(" `gorm:\"column:%s\" json:\"%s\" form:\"%s\"`", propertyTmp, propertyTmp, propertyTmp) result = result + oldLineTmp + "\n" } return result } // 增強型split,對 a,,,,,,,b,,c 以","進行切割成[a,b,c] func Split(s string, sub string) []string { var rs = make([]string, 0, 20) tmp := "" Split2(s, sub, &tmp, &rs) return rs } // 附屬于Split,可獨立使用 func Split2(s string, sub string, tmp *string, rs *[]string) { s = strings.Trim(s, sub) if !strings.Contains(s, sub) { *tmp = s *rs = append(*rs, *tmp) return } for i, _ := range s { if string(s[i]) == sub { *tmp = s[:i] *rs = append(*rs, *tmp) s = s[i+1:] Split2(s, sub, tmp, rs) return } } } // 駝峰轉(zhuǎn)下劃線 func HumpToUnderLine(s string) string{ if s =="ID" { return "id" } var rs string elements:=FindUpperElement(s) for _,e :=range elements{ s =strings.Replace(s, e, "_"+strings.ToLower(e),-1) } rs = strings.Trim(s," ") rs = strings.Trim(rs,"\t") return strings.Trim(rs,"_") } // 找到字符串中大寫字母的列表,附屬于HumpToUnderLine func FindUpperElement(s string) []string { var rs = make([]string, 0, 10) for i := range s { if s[i] >= 65 && s[i] <= 90 { rs = append(rs, string(s[i])) } } return rs }
如何使用
func TestAddJsonFormTag(t *testing.T) { rs := AddJsonFormGormTag(` type User struct{ Id uint64 NameSpace string DailyRoutine int } `) fmt.Println(rs) }
結(jié)果
type User struct{ Id uint64 `gorm:"column:id" json:"id" form:"id"` NameSpace string `gorm:"column:name_space" json:"name_space" form:"name_space"` DailyRoutine int `gorm:"column:daily_routine" json:"daily_routine" form:"daily_routine"` }
具體對齊,使用go fmt xxx.go 命令
goland 快捷鍵是 ctrl alt L
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
Go語言同步等待組sync.WaitGroup結(jié)構(gòu)體對象方法詳解
這篇文章主要為大家介紹了Go語言同步等待組sync.WaitGroup結(jié)構(gòu)體對象方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08MacOS下本地golang環(huán)境搭建詳細(xì)教程
這篇文章主要介紹了MacOS下本地golang環(huán)境搭建詳細(xì)教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09gin解析json格式的數(shù)據(jù)出錯的處理方案
這篇文章主要介紹了gin解析json格式的數(shù)據(jù)出錯的處理方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03go程序中同一個包下為什么會存在多個同名的函數(shù)或變量(詳細(xì)解析)
這篇文章主要介紹了go程序中同一個包下為什么會存在多個同名的函數(shù)或變量(詳細(xì)解析),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2024-05-05Go標(biāo)準(zhǔn)庫日志打印及同時輸出到控制臺與文件
Go語言內(nèi)置的log包實現(xiàn)了簡單的日志服務(wù),下面這篇文章主要給大家介紹了關(guān)于Go標(biāo)準(zhǔn)庫日志打印及同時輸出到控制臺與文件的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11