2017-07-20 58 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