本文是《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.sumgo 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"` // 将类型设置为指针...}...
