本文是《Golang 升级之路》系列第一篇。
参考文章:
go mod介绍
go mod 是 go 的主流依赖管理工具(类似于 Node.js 的 npm、Java 的 maven),go1.13版本已支持,安装相关的内容可以参考这篇文章:说一说go mod,以下总结常用的一些 go mod 命令:
# 初始化当前目录为模块根目录,生成go.mod, go.sum文件
go mod init
# 下载依赖包
go mod download
# 整理检查依赖,如果缺失包会下载或者引用的不需要的包会删除
go mod tidy
# 复制依赖到vendor目录下面
go mod vendor
# 可看完整所有的命令
go mod
# 删除不需要的依赖包、下载新的依赖包、更新go.sum
go mod tidy
结构体JSON转换
omitempty——缺省修饰
- 使用 omitempty 修饰结构体中的字段,在把结构体转换 JSON 时,如果该字段值是空值(比如: false、0、””、nil 指针、nil 接口、长度为0的数组、切片、映射),则不会输出该字段,例如: ```go package main
import ( “encoding/json” “fmt” )
type Activity struct {
ID int json:"id"
TagID int json:"tagID,omitempty"
Cover string json:"cover"
Description string json:"description,omitempty"
Title string json:"title"
TypeID int json:"typeID"
Status int json:"status"
CreateAt string json:"createAt"
}
func main() { activityItem := Activity{ ID: 430, TagID: 0, Cover: “//qiniu-cdn.wbu-bit1.online/1591242437643.jpg”, Description: “”, Title: “哈吉斯店庆”, TypeID: 6, Status: 1, CreateAt: “2020-08-24 10:17:15”, }
activityJSON, err := json.Marshal(activityItem)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(string(activityJSON))
}
}
以上代码打印出的 activityJSON 内容为:
```json
{
"id": 430,
"cover": "//qiniu-cdn.wbu-bit1.online/1591242437643.jpg",
"title": "哈吉斯店庆",
"typeID": 6,
"status": 1,
"createAt": "2020-08-24 10:17:15"
}
可以发现输出的 JSON 不包含 tagID、description 两个字段,因为这两个字段都用 omitempty 修饰且其值皆为空。
需要注意,如果结构体A内含有结构体B类型的字段并用 omitempty 修饰,如果不给该字段进行任何赋值操作,输出的 JSON 仍然会包含一个结构体B的默认 JSON 数据元,而不是忽略其输出,例如:
...
type Activity struct {
ID int `json:"id"`
TagInfo Tag `json:"tagInfo,omitempty"`
...
}
type Tag struct {
ID int `json:"id"`
Name string `json:"name"`
}
func main() {
activityItem := Activity{
ID: 430,
Cover: "//qiniu-cdn.wbu-bit1.online/1591242437643.jpg",
Description: "",
Title: "哈吉斯店庆",
TypeID: 6,
Status: 1,
CreateAt: "2020-08-24 10:17:15",
}
...
}
以上代码,我将原 Activity 结构体中的 TagID 字段改成了 TagInfo 字段,其数据类型是结构体 Tag,并移除 activityItem 中的 TagID 的赋值,同时不对 TagInfo 进行赋值操作,此时输出的 JSON 内容如下:
{
"id": 430,
"tagInfo": {
"id": 0,
"name": ""
},
"cover": "//qiniu-cdn.wbu-bit1.online/1591242437643.jpg",
"title": "哈吉斯店庆",
"typeID": 6,
"status": 1,
"createAt": "2020-08-24 10:17:15"
}
可见其仍会输出一个表征空值的 tagInfo 字段。
如果要实现结构体字段为空时不输出默认值,可以通过指针实现,只需进行以下操作:
...
type Activity struct {
...
TagInfo *Tag `json:"tagInfo,omitempty"` // 将类型设置为指针
...
}
...