2012-12-11 69 views
2

我有一個結構,看起來像:如何將結構指針轉換爲指針類型的列表中去

type inv struct { 
    ID int  `json:"id"` 
    Name string `json:"name"` 
} 

我從數據庫中查詢一些數據(假設沒有錯誤):

rows, err := db.Query("select id, name from inv_table") 

通常情況下,我不得不通過掃描

var i inv 
for rows.Next() { 
    rows.Scan(&i.ID, &i.Name) 
} 

我想這可能工作(被測試噸至拉離該行的數據明天):

var i inv 
for rows.Next() { 
    var x []interface{} = [&i.ID, &i.Name] 
    rows.Scan(x...) 
} 

實際上,我在查詢的結果集中有更多的列。

rows.Scan(&i) 

或至少:

rows.Scan(getExportedValuePointers(&i)...) 

我想我可以總是寫某種編碼器,但是,在我看來,應該有東西在框中已經。

**我意識到我總是可以編寫一些類似於encode/xml或encode/json的反射代碼......但我希望有人已經完成了它。

UPDATE:下面的代碼工作正常,但不是因爲我想:

package main 
import "fmt" 
type inv struct { 
    A int 
    B string 
} 
func main() { 
    var i inv 
    fmt.Printf("hello\n") 
    n, err := fmt.Sscan("1 c", &i.A, &i.B) 
    fmt.Printf("retval: %d %#v\n", n, err) 
    fmt.Printf("retval: %d, %s, %d %#v\n", i.A, i.B, n, err) 
    j := []interface{}{&i.A, &i.B} 
    k := []interface{}{i.A, i.B} 
    n, err = fmt.Sscan("2 d", j...) 
    fmt.Printf("retval: %d, %s, %d %#v\n", i.A, i.B, n, err) 
    fmt.Printf("retval: %d, %s\n", k...) 
} 
+0

您是否試圖從下拉數據行該數據庫並只根據特定列而不是所有列創建「inv」類型的切片? – Nucleon

回答

2

如果你正在尋找將您的SQL查詢自動綁定到你的「INV」結構封裝,然後看看GORP:

https://github.com/coopernurse/gorp

+0

雖然Gorp不是我正在尋找的實際答案是在Gorp裏面。謝謝。 – Richard

+0

更新:gorp工作。 – Richard

0

沒有什麼可以自動做到這一點,但你可以使用反映包做寫一個函數。

相關問題