如何正确扫描 pq 数组?

How to correctly Scan pq arrays?

在 PostgreSQL 数据库中我有一个 table:

| ORGANIZATION_ID | FACTOR_IDS   | CALCULATION_VALUES  |
|-----------------|--------------|---------------------|
| 1               | {1,2,3,4,5}  | {0,66.66,50,100,80} |
| 2               | NULL         | NULL                |
| 1               | {6,7,8,9,10} | {0,77.77,60,110,90} |

在 Go 中,我对 table 进行查询,然后尝试使用 Scan 方法。不幸的是我得到一个错误:

Trace: runtime error: invalid memory address or nil pointer dereference

我的代码:

type Entry struct {
    OrganizationID int
    FactorIDS pq.Int64Array
    CalculationValues pq.Float64Array
}

rows, err = database.DBGORM.Raw(`SELECT * FROM ANALYTICS`, ID).Rows()

if err != nil {
    utils.Logger().Println(err)
    return
}

defer rows.Close()

for rows.Next() {
    var entry *Entry

    if err = rows.Scan(&entry.OrganizationID, &entry.FactorIDS, &entry.CalculationValues); err != nil {
        utils.Logger().Println(err) // <- RAISE ERROR
        return
    }

    if entry.FactorIDS != nil {
        for index, value := range factorID {
            // some code here
        }
    }
}

我该如何解决这个问题?

此外,如果我将类型从 pq.Int64Array 更改为 *pq.Int64Array,Go 编译器会给出错误:Cannot range over data *pq.Int64Array 对于上面的代码。

nil 指针取消引用在 entry 上进行。通过将 entry 从指针更改为值来修复:

for rows.Next() {
    var entry Entry  // <--- change on this line
    ... remaining code as in question
}

因为这几个&entry.OrganizationID、&entry.FactorIDS、&entry.CalculationValues而慌了。由于条目是指针类型,您还没有为它初始化内存。如果你想要指针类型的结构,你可以像这样初始化它:

for rows.Next() {
    entry:=new(Entry)

    if err = rows.Scan(&entry.OrganizationID, &entry.FactorIDS, &entry.CalculationValues); err != nil {
        utils.Logger().Println(err) // <- RAISE ERROR
        return
    }

    if entry.FactorIDS != nil {
        for index, value := range factorID {
            // some code here
        }
    }
}