比如一本书有关的结构体
会有针对书整体,和针对书的每一个章节这样的结构体。
我们在章节里定义一个 book的指针,这样就可以通过某本书的某个章节信息可以获取到整本书相关的信息,比较方便。
比如说有这样一个需求,判断这本书的章节数量是否大于1,如果章节只有1章,那么不在每章的标题中添加章节数,也就是 “第一章”,“第二章”这种。
我们定义一个方法设定每一章标题,Chapter结构体中不知道章节数,除非我们增加一个整本书的章节数字段,这种方式如果我们还需要其他整本书有关的信息,还需要不断添加字段,冗余就比较大。
所以最好还是在Chapter中直接添加一个book指针字段,这样就可以随意访问整本书相关的所有信息了。
type Book struct {
Title string
Page int
ChapterList []*Chapter
}
type Chapter struct {
Title string
Page int
book *Book
}
此时如果你想把book保存为json文件,调用Json.Marshal方法的时候,它会对指针也进行展开,这里的情况时book里展开有chapter的指针,chapter里展开有book的指针,就这样不断循环展开程序就不断把内存占满,造成电脑卡死。
有两种方法可以让json序列化忽略某个字段,避免这种指针循环展开卡死的情况
-
小写的变量名是匿名变量,Json.Marshal不会进行解析
在字段的后面添加下面的json注释 `json:"-"`
网友评论