golang中json和struct的使用說(shuō)明
1、返回json響應(yīng)結(jié)果
在struct的字段后面加入json:"key"可以進(jìn)行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的某個(gè)字段沒有傳值,則輸出的json為默認(rèn)值,可以通過(guò)"omitempty"參數(shù)忽略掉值為空的鍵
type MyData struct {
Id int `json:"id,omitempty"`
Name string `json:"name"`
}
data = Mydata{Name:"zhangsan"}
SuccessRsp(ctx, plans)
則id的鍵會(huì)被忽略掉,輸出json為:
{
"code": 0,
"msg": "ok",
"data": {
"name": "zhangsan"
}
}
2.可以用"-"來(lái)完全掉忽略掉某個(gè)鍵, 比如下面的id不會(huì)被轉(zhuǎn)化到j(luò)son字段中
type MyData struct {
Id int `json:"-"`
Name string `json:"name"`
}
2、將數(shù)據(jù)庫(kù)的字段轉(zhuǎn)化成struct
如果使用gorm框架進(jìn)行數(shù)據(jù)庫(kù)連接,則可以用gorm:"column:key"來(lái)指定數(shù)據(jù)庫(kù)的鍵,如下所示
type User struct {
Id int64 `gorm:"column:id" json:"id"`
Name string `gorm:"column:name" json:"name,omitempty"`
}
補(bǔ)充:golang 一鍵生成 form,json,gorm標(biāo)簽
每次有新表產(chǎn)生時(shí),就會(huì)有新的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
}
// 增強(qiáng)型split,對(duì) a,,,,,,,b,,c 以","進(jìn)行切割成[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,可獨(dú)立使用
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"`
}
具體對(duì)齊,使用go fmt xxx.go 命令
goland 快捷鍵是 ctrl alt L
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
Go語(yǔ)言同步等待組sync.WaitGroup結(jié)構(gòu)體對(duì)象方法詳解
這篇文章主要為大家介紹了Go語(yǔ)言同步等待組sync.WaitGroup結(jié)構(gòu)體對(duì)象方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
MacOS下本地golang環(huán)境搭建詳細(xì)教程
這篇文章主要介紹了MacOS下本地golang環(huán)境搭建詳細(xì)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
gin解析json格式的數(shù)據(jù)出錯(cuò)的處理方案
這篇文章主要介紹了gin解析json格式的數(shù)據(jù)出錯(cuò)的處理方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03
golang語(yǔ)言中for循環(huán)語(yǔ)句用法實(shí)例
這篇文章主要介紹了golang語(yǔ)言中for循環(huán)語(yǔ)句用法,實(shí)例分析了for循環(huán)遍歷的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01
go程序中同一個(gè)包下為什么會(huì)存在多個(gè)同名的函數(shù)或變量(詳細(xì)解析)
這篇文章主要介紹了go程序中同一個(gè)包下為什么會(huì)存在多個(gè)同名的函數(shù)或變量(詳細(xì)解析),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-05-05
Go標(biāo)準(zhǔn)庫(kù)日志打印及同時(shí)輸出到控制臺(tái)與文件
Go語(yǔ)言內(nèi)置的log包實(shí)現(xiàn)了簡(jiǎn)單的日志服務(wù),下面這篇文章主要給大家介紹了關(guān)于Go標(biāo)準(zhǔn)庫(kù)日志打印及同時(shí)輸出到控制臺(tái)與文件的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11
Go語(yǔ)言設(shè)計(jì)模式之結(jié)構(gòu)型模式
本文主要聚焦在結(jié)構(gòu)型模式(Structural Pattern)上,其主要思想是將多個(gè)對(duì)象組裝成較大的結(jié)構(gòu),并同時(shí)保持結(jié)構(gòu)的靈活和高效,從程序的結(jié)構(gòu)上解決模塊之間的耦合問(wèn)題2021-06-06

