Как объявить поля json, допускающие значение NULL, в структурах golang?
Обычно мне нравится использовать указатели для примитивных типов данных в своих структурах, чтобы при их json.Marshal nil
поля всегда переводятся на "field": null
в строке json. Но это затруднит создание нового экземпляра структуры, поскольку я не могу использовать литералы.
Например:
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, допускающие значение NULL, так и простоту инициализации структур без объявления дополнительных переменных?
2 ответа
Добавьте в приложение вспомогательную функцию:
func NewString(s string) *string {
return &s
}
И тогда вы можете использовать литералы:
// You can do this:
book := &Book{
Title: NewString("Book1"),
}
Также существуют библиотеки, предоставляющие эти NewXXX()
функции, поэтому вам не нужно их добавлять (например, github.com/icza/gox/gox
, раскрытие: я автор).
См. Также: Как сделать буквальный *int64 в Go?
Возникла проблема с вашей инициализацией:
(исправлено)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>}