2017-07-20 56 views
0

我有包含像这样切片字段的结构,现在我想收集来自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) 
} 

...和然后附加到片结构

回答

4

不,这是做到这一点的方法。你基本上在做一个关键点,我不知道自动做这件事。鉴于你只是用几行代码完成它,我没有看到你的解决方案有问题。

既然你要扫描到每列一个变量,你实际上并不需要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类型。

+2

另一种解决方案是使用自定义类型('[] string')来实现'sql.Scanner'接口,其中'Scan'函数会附加结果。这种情况可能有点过分。 – yazgazan

+0

这将工作!这看起来像是更多的工作/复杂性,再加上它在阅读实际发生的代码时不那么清晰。但是,如果真实情况比问题中的例子更复杂,则可能需要这样做。 – Adrian