Как получить доступ к структуре вложенных указателей - PullRequest
0 голосов
/ 02 марта 2020

Как получить доступ к структуре вложенных указателей при запросе из 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"
    }
]
...