Как получить доступ к структуре вложенных указателей при запросе из Mysql БД. Я занимаюсь разработкой API-интерфейса для книг, в котором при обработке запроса на выборку сведений о книге я запрашиваю БД и спроектировал структуру своего ответа следующим образом:
Id int64 `json:"id,omitempty"`
Name *string `json:"name,omitempty"`
ISBN *string `json:"isbn,omitempty"`
Language *string `json:"langauge,omitempty"`
PublisherId *uint16 `json:"publisher_id,omitempty"`
PublishedAt *utils.MysqlFormatDate `json:"published_at,omitempty"`
BookPublishers *BookPublisher `json:"book_publishers,-"`
BookGenre *BookGenre `json:"book_genre,m"`
BookAuthor *BookAuthor `json:"book_author,-"`
Prices *BookPrice `json:"prices,-"`
Other *BookOthers `json:"other,-"`
Status *bool `json:"status,omitempty"`
CreatedAt *time.Time `json:"created_at,omitempty"`
UpdatedAt *time.Time `json:"updated_at,omitempty"`
}
type BookPublisher struct {
Id *int64 `json:"id,omitempty"`
Name *string `json:"name,omitempty"`
}
И я запрашиваю запись из БД и сканирую результат с использованием метода row.Scan
payload := make([]*models.Books, 0)
data := new(models.Books)
row := b.db.QueryRow(`SELECT b.*, p.name as publication_name FROM books b inner join publications as p ON p.id = b.publisher_id where b.id = ?`, id)
err := row.Scan(
&data.Id,
&data.Name,
&data.ISBN,
&data.Prices.NewPrice,
&data.Language,
&data.Other.Quantity,
&data.Prices.OldPrice,
&data.Other.Type,
&data.BookPublishers.Id,
&data.Status,
&data.Other.NumberPages,
&data.PublishedAt,
&data.CreatedAt,
&data.UpdatedAt,
&data.BookPublishers.Name,
)
if err != nil {
if err == sql.ErrNoRows {
return payload, nil
}
return nil, err
}
При доступе к записи я получаю ошибку
2020/03/02 14:39:38 http: panic serving [::1]:49204: runtime error: invalid memory address or nil pointer dereference
goroutine 36 [running]:
net/http.(*conn).serve.func1(0xc0001750e0)
/usr/local/Cellar/go/1.13.8/libexec/src/net/http/server.go:1767 +0x139
panic(0x139c180, 0x16f65b0)
/usr/local/Cellar/go/1.13.8/libexec/src/runtime/panic.go:679 +0x1b2
book-store-api/api/repositories.(*BookRepo).GetBookDetail(0xc000134020, 0x149f3a0, 0xc00019e120, 0x8, 0x8, 0x0, 0x0, 0x137c201, 0xc00019a180)
/Users/himanshu/go-learning/book-store-api/api/repositories/books.go:144 +0xf0
book-store-api/api/controllers.(*Books).GetOne(0xc00012a040, 0x149e6a0, 0xc0001a4000, 0xc0001b8100)
/Users/himanshu/go-learning/book-store-api/api/controllers/books.go:109 +0xdf
net/http.HandlerFunc.ServeHTTP(0xc00012aaf0, 0x149e6a0, 0xc0001a4000, 0xc0001b8100)
/usr/local/Cellar/go/1.13.8/libexec/src/net/http/server.go:2007 +0x44
github.com/gorilla/mux.(*Router).ServeHTTP(0xc000136000, 0x149e6a0, 0xc0001a4000, 0xc000180200)
/Users/himanshu/go/pkg/mod/github.com/gorilla/mux@v1.7.4/mux.go:210 +0xe2
net/http.serverHandler.ServeHTTP(0xc000188000, 0x149e6a0, 0xc0001a4000, 0xc000180200)
/usr/local/Cellar/go/1.13.8/libexec/src/net/http/server.go:2802 +0xa4
net/http.(*conn).serve(0xc0001750e0, 0x149f2e0, 0xc000152640)
/usr/local/Cellar/go/1.13.8/libexec/src/net/http/server.go:1890 +0x875
created by net/http.(*Server).Serve
/usr/local/Cellar/go/1.13.8/libexec/src/net/http/server.go:2928 +0x384
Это дает мне ошибку при обработке **&data.Prices.NewPrice**
от сканирования БД. Я хочу получить ответ, подобный
"success": true,
"data": [
{
"id": 8,
"name": "Romeo and Juliet",
"isbn": "1586638459",
"language": "English",
"published_at": "2010-08-08",
"book_publishers": [{
"id": 2,
"name": "Hachette Livre"
}],
"prices": {
"new": 2123.12,
"old": 780
},
"other": {
"quantity": 100,
"type": "hard",
"number_pages": 120
},
"status": true,
"created_at": "2020-03-02T11:16:34Z",
"updated_at": "2020-03-02T06:43:06Z"
}
]