【问题标题】:Scan database columns into struct with slices使用切片将数据库列扫描到结构中
【发布时间】:2017-07-20 13:34:32
【问题描述】:

我有一个结构体,其中的字段包含这样的切片,现在我想将 sql 查询中的列收集到这些切片中

type StructOfSlices struct {
    Column1 []string
    Column2 []string
}

有没有比下面更简单/更可扩展/有效的方法?

这里我先创建一个“单一”版本的结构...

type StructSingle struct {
    Column1 string
    Column2 string
}

var s StructOfSlices

rows, _ := db.Query("SELECT column1, column2 FROM table")

...然后扫描每个单独的单个结构...

for rows.Next() {
    var single StructSingle

    db.Scan(&single.Column1, &single.Column2)

    s.Column1 = append(s.Column1, single.Column1)
    s.Column2 = append(s.Column2, single.Column2)
}

...然后追加到切片结构

【问题讨论】:

    标签: go


    【解决方案1】:

    不,这就是这样做的方式。你基本上是在做一个支点,我不知道自动做那个。鉴于您只用几行代码就完成了,我认为您的解决方案没有问题。

    由于您要扫描每列的变量,因此您实际上根本不需要 StructSingle 类型 - 您可以只使用两个本地 string 变量,这样会更简单:

    for rows.Next() {
        var col1, col2 string
        db.Scan(&col1, &col2)
    
        s.Column1 = append(s.Column1, col1)
        s.Column2 = append(s.Column2, col2)
    }
    

    并完全摆脱 StructSingle 类型。

    【讨论】:

    • 另一种解决方案是使用自定义类型 ([]string) 实现 sql.Scanner 接口,其中 Scan 函数将附加结果。对于这种情况可能有点矫枉过正。
    • 那行得通!不过,这似乎是更多的工作/复杂性,而且在阅读代码时它使实际发生的事情变得不太清楚。但是,如果实际情况比问题中的示例更复杂,则可能是有道理的。
    猜你喜欢
    • 2018-08-05
    • 2020-06-07
    • 1970-01-01
    • 2020-08-25
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多