Pointers 扫描错误:sql:列索引11上的扫描错误:目标不是指针

Pointers 扫描错误:sql:列索引11上的扫描错误:目标不是指针,pointers,dictionary,go,struct,Pointers,Dictionary,Go,Struct,我知道问题是什么,当我试图扫描数据库调用中的字段时,我没有提供指针地址-但是在这种情况下,我不太确定如何解决它 我有一个结构,看起来像这样: type ItemsRequest struct { Sku string `json:"sku"` Name string `json:"name"` Barcode string `json:"barcode,omitempty"` Category struct { ID

我知道问题是什么,当我试图扫描数据库调用中的字段时,我没有提供指针地址-但是在这种情况下,我不太确定如何解决它

我有一个结构,看起来像这样:

type ItemsRequest struct {
    Sku      string `json:"sku"`
    Name     string `json:"name"`
    Barcode  string `json:"barcode,omitempty"`
    Category struct {
        ID               string        `json:"id,omitempty"`
        Name             string        `json:"name,omitempty"`
        Subcategories    []interface{} `json:"subcategories,omitempty"`
        CategoryPosition int           `json:"categoryPosition,omitempty"`
        ResourceURI      string        `json:"resource_uri,omitempty"`
    } `json:"category,omitempty"`
    CategoryPosition int               `json:"categoryPosition,omitempty"`
    LongDesc         string            `json:"longDesc,omitempty"`
    MinQty           int               `json:"minQty,omitempty"`
    MultQty          int               `json:"multQty,omitempty"`
    UnitPrice        string            `json:"unitPrice,omitempty"`
    ImageURLs        []string          `json:"imageURLs,omitempty"`
    Variants         []interface{}     `json:"variants,omitempty"`
    AdditionalPrices map[string]string `json:"additionalPrices,omitempty"`
    audtdatetime     int
}
AdditionalPrices
字段用于表示价值对象,例如:

{
    'UK': "12.34",
    'AU': "14.00"
}
因此,我很有信心字段的
map[string]string
类型是正确的

我正在从数据库检索数据以填充此结构,然后尝试将结果扫描到此结构的实例中。在我的查询中,我有一个预定义的列数,我想用它来填充
AdditionalPrices

因此,我从以下内容开始:

func getItemsFromDB() []*ItemsRequest {
    rows, err := bcdataDBConnection.Query(`
        SELECT  *
        FROM    vProducts
        WHERE   max_audit_date_time > @AuditTime
    `, sql.Named("AUDITTIME", 2016101412000000))

    if err != nil {
        log.Fatal("There was an issue with the query for items: ", err)
    }

    defer rows.Close()

    var items []*ItemsRequest

    for rows.Next() {
        var item = &ItemsRequest{}
        err := rows.Scan(
            &item.Sku,
            &item.Name,
            &item.Category.ID,
            &item.Category.Name,
            &item.Category.CategoryPosition,
            &item.LongDesc,
            &item.Barcode,
            &item.UnitPrice,
            &item.MinQty,
            &item.MultQty,
            &item.CategoryPosition,
            &item.AdditionalPrices["NZBASE"],
            &item.AdditionalPrices["NZWWW"],
            &item.AdditionalPrices["MMCMFR"],
            &item.AdditionalPrices["MMBASE"],
            &item.AdditionalPrices["AUBASE"],
            &item.AdditionalPrices["MMCMAU"],
            &item.AdditionalPrices["AUDSA"],
            &item.AdditionalPrices["AUDVIC"],
            &item.AdditionalPrices["AUDWWW"],
            &item.audtdatetime,
        )
        if err != nil {
            log.Fatal("Scan error: ", err)
        }

        items = append(items, item)
    }

    return items
}
但是,这似乎不是正确的语法,因此我将其更改为:

func getItemsFromDB() []*ItemsRequest {
    rows, err := bcdataDBConnection.Query(`
        SELECT  *
        FROM    vHandshakeProducts
        WHERE   max_audit_date_time > @AuditTime
    `, sql.Named("AUDITTIME", 2016101412000000))

    if err != nil {
        log.Fatal("There was an issue with the query for items: ", err)
    }

    defer rows.Close()

    var items []*ItemsRequest

    for rows.Next() {
        var item = &ItemsRequest{}
        err := rows.Scan(
            &item.Sku,
            &item.Name,
            &item.Category.ID,
            &item.Category.Name,
            &item.Category.CategoryPosition,
            &item.LongDesc,
            &item.Barcode,
            &item.UnitPrice,
            &item.MinQty,
            &item.MultQty,
            &item.CategoryPosition,
            item.AdditionalPrices["NZBASE"],
            item.AdditionalPrices["NZWWW"],
            item.AdditionalPrices["MMCMFR"],
            item.AdditionalPrices["MMBASE"],
            item.AdditionalPrices["AUBASE"],
            item.AdditionalPrices["MMCMAU"],
            item.AdditionalPrices["AUDSA"],
            item.AdditionalPrices["AUDVIC"],
            item.AdditionalPrices["AUDWWW"],
            &item.audtdatetime,
        )
        if err != nil {
            log.Fatal("Scan error: ", err)
        }

        items = append(items, item)
    }

    return items
}
这是我的IDE更喜欢的,但是运行它时,我得到了错误:

2018/01/15 15:35:06扫描错误:sql:列索引11上的扫描错误:目标不是指针

因此,在这一点上,我不太确定如何从我的数据库调用中填充
AdditionalPrices
的值

我需要怎么做才能用我从数据库获得的值填充
AdditionalPrices
映射?
根据代码中的键,我已经知道要为其分配值的映射键。

行。扫描是指扫描DB行中的字段。它无法以嵌套方式扫描字段的值

因此,只需说
&item.AdditionalPrices
即可扫描每行的
AdditionalPrices
字段,如下所示:

    err := rows.Scan(
        &item.Sku,
        &item.Name,
        &item.Category.ID,
        &item.Category.Name,
        &item.Category.CategoryPosition,
        &item.LongDesc,
        &item.Barcode,
        &item.UnitPrice,
        &item.MinQty,
        &item.MultQty,
        &item.CategoryPosition,
        &item.AdditionalPrices,
        &item.audtdatetime,
    )

谢谢如果它的类型为
map[string]string
那么它如何获取密钥?使用的数据库引擎是什么?数据库字段
additionalPrices
的类型是什么?数据库是sql server,列类型是decimal(9,2)。我认为
additionalPrices
的类型类似于JSON。如果每个额外的价格都有单独的十进制类型列,那么使用
map[string]interface{}
进行扫描是不可能的,这很麻烦。我只需要扫描到一个临时变量,然后手动构建映射。无论如何,谢谢你的帮助。