如何在 golang 结构中声明可为空的 json 字段?
How to declare nullable json fields in golang structs?
我通常喜欢在我的结构中使用原始数据类型的指针,这样当我 json.Marshal 它们时,nil
字段总是转换为 [=20] 中的 "field": null
=] 字符串。但这将使创建新结构实例变得困难,因为我不能使用文字。
例如:
type Book struct {
Price *float32 `json:"price"`
Title *string `json:"title"`
Author *string `json:"author"`
}
func main() {
// I can't do this
book := &Book{
Title: "Book1",
}
}
如您所见,当我使用字符串指针时,除非我为每个指针字段声明一个变量并将它们分配给结构字段,否则我无法轻松地初始化结构。是否可以在不声明额外变量的情况下同时拥有可为空的 json 字段和易于初始化结构?
为您的应用添加辅助功能:
func NewString(s string) *string {
return &s
}
然后你可以使用文字:
// You can do this:
book := &Book{
Title: NewString("Book1"),
}
还有提供这些 NewXXX()
功能的库,因此您不必添加它们(例如 github.com/icza/gox/gox
,披露:我是作者)。
查看相关内容:
你的初始化有一些问题:
type Books
不是声明结构的有效方式(已修复)
您正在尝试将普通 string
分配给 pointer
示例解决方案:
type Book struct {
Price *float32 `json:"price"`
Title *string `json:"title"`
Author *string `json:"author"`
}
func main() {
bookTitle := "Book1"
// I can't do this
book := &Book{
Title: &bookTitle,
}
}
另一种解决问题的方法是创建一个 Constructor
:
type Book struct {
Price *float32 `json:"price"`
Title *string `json:"title"`
Author *string `json:"author"`
}
func (b *Book) Book(title string){
b.Title = &title
}
func main() {
var book Book
fmt.Printf("%+v\n", book)
book.Book("Book1")
fmt.Printf("%+v\n", book)
}
结果将是这样的:
{Price:<nil> Title:<nil> Author:<nil>}
{Price:<nil> Title:0xc00003e1f0 Author:<nil>}
我通常喜欢在我的结构中使用原始数据类型的指针,这样当我 json.Marshal 它们时,nil
字段总是转换为 [=20] 中的 "field": null
=] 字符串。但这将使创建新结构实例变得困难,因为我不能使用文字。
例如:
type Book struct {
Price *float32 `json:"price"`
Title *string `json:"title"`
Author *string `json:"author"`
}
func main() {
// I can't do this
book := &Book{
Title: "Book1",
}
}
如您所见,当我使用字符串指针时,除非我为每个指针字段声明一个变量并将它们分配给结构字段,否则我无法轻松地初始化结构。是否可以在不声明额外变量的情况下同时拥有可为空的 json 字段和易于初始化结构?
为您的应用添加辅助功能:
func NewString(s string) *string {
return &s
}
然后你可以使用文字:
// You can do this:
book := &Book{
Title: NewString("Book1"),
}
还有提供这些 NewXXX()
功能的库,因此您不必添加它们(例如 github.com/icza/gox/gox
,披露:我是作者)。
查看相关内容:
你的初始化有一些问题:
(已修复)type Books
不是声明结构的有效方式您正在尝试将普通
string
分配给pointer
示例解决方案:
type Book struct {
Price *float32 `json:"price"`
Title *string `json:"title"`
Author *string `json:"author"`
}
func main() {
bookTitle := "Book1"
// I can't do this
book := &Book{
Title: &bookTitle,
}
}
另一种解决问题的方法是创建一个 Constructor
:
type Book struct {
Price *float32 `json:"price"`
Title *string `json:"title"`
Author *string `json:"author"`
}
func (b *Book) Book(title string){
b.Title = &title
}
func main() {
var book Book
fmt.Printf("%+v\n", book)
book.Book("Book1")
fmt.Printf("%+v\n", book)
}
结果将是这样的:
{Price:<nil> Title:<nil> Author:<nil>}
{Price:<nil> Title:0xc00003e1f0 Author:<nil>}