json.Marshal() 中 omitempty 的使用

我们使用 json.Marshal() 将结构体转换为 json。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
type Role struct {
Id int `json:"id"`
Name string `json:"Name"`
}

type User struct {
Id int `json:"id"`
Username string `json:"username"`
Role *Role `json:"role"`
}

user := &User{
Id: 1,
Username: "user1",
Role: nil,
}

b, err := json.Marshal(user)
if err != nil {
panic(err)
}

fmt.Println(string(b)) // 输出:{"id":1,"username":"user1","role":null}

json.Marshal() 会将空指针转换为 null,所以 role 字段的值为 null

我们可能有的时候就是不想让值为 null 的字段出现在 json 中,这个时候可以使用 omitempty tag。例如:

1
2
3
4
5
6
7
type User struct {
Id int `json:"id"`
Username string `json:"username"`
Role *Role `json:"role,omitempty"`
}

fmt.Println(string(b)) // 输出:{"id":1,"username":"user1"}

加了 omitempty 之后,role 字段就被忽略了,不会出现在 json 中。实际上加了 omitempty 后,会忽略所有零值,不仅仅是空指针。

如果 omitempty 没有生效,看一下你是不是写成了 json:"role, omitempty"

GORM 会忽略结构体中的零值

1
2
3
4
5
6
7
8
db.Where(&User{Age: 0, Gender: "male"}).Find(&users)
// select * from `users` where `gender` = 'male';

db.where(&User{Age: 0, Gender: ""}).Delete(&User{})
// delete from `users`;

db.Model(&User{}).Where(&User{Id: 0}).Update(&User{Age: 0, Gender: "male"})
// update `users` set `gender` = 'male';

masOS 安装 Consolas 字体

macOS 没有预装 Consolas 字体,不过可以手动安装(安装方法来自这篇文章):

1
2
3
4
5
6
7
8
brew install cabextract
cd ~/Downloads
mkdir consolas
cd consolas
curl -O http://download.microsoft.com/download/f/5/a/f5a3df76-d856-4a61-a6bd-722f52a5be26/PowerPointViewer.exe
cabextract PowerPointViewer.exe
cabextract ppviewer.cab
open CONSOLA*.TTF

上面的链接失效的话,可以试试下面的:

1
curl -LO https://sourceforge.net/projects/mscorefonts2/files/cabs/PowerPointViewer.exe