Scan()我想在 package 中使用sql,但列數以及參數的數量將在運行時發生變化。這是以下人的簽名Scan():func (rs *Rows) Scan(dest ...interface{}) error根據文檔,*interface{}是Scan(). 所以我想創建一個片段[]*interface{}并將其擴展為參數。這是我認為可行的方法:func query(database *sql.DB) { rows, _ := database.Query("select * from testTable") for rows.Next() { data := make([]*interface{}, 2) err := rows.Scan(data...) // Compilation error fmt.Printf("%v%v\n", *data[0], *data[1]) if err != nil { fmt.Println(err.Error()) } }}編譯失敗cannot use data (type []*interface {}) as type []interface {} in argument to rows.Scan。我以為那data...會擴展到&data[0], &data[1],但顯然不是。我不明白錯誤信息。*interface{}與 兼容interface{},那么為什么我不能將指針切片擴展到接口類型?這有效:func query(database *sql.DB) { rows, _ := database.Query("select * from testTable") for rows.Next() { data := make([]*interface{}, 2) err := rows.Scan(&data[0], &data[1]) // Only changed this line fmt.Printf("%v%v\n", *data[0], *data[1]) // Outputs "[48][116 101 120 116]" if err != nil { fmt.Println(err.Error()) } }}但是我不能使用它,因為列數在編譯時是未知的。我該如何編寫這段代碼,以便我可以將可變數量的傳遞*interface{}給rows.Scan()?
2 回答

慕的地8271018
TA貢獻1796條經驗 獲得超4個贊
首先,您不能使用[]*interface{}指針切片來接口,而不是[]interface{}接口是指針的地方。[]*interface{}不同于[]interface{}. 只需創建一片接口,其中每個元素都是指向具體類型的指針。
這是您將如何執行此操作的片段。
var x int
var s string
data := []interface{}{&x, &s}
rows.Scan(data...)
關于使用...擴展運算符的注意事項。

紅糖糍粑
TA貢獻1815條經驗 獲得超6個贊
如果你真的想傳遞 a []*interface{}(也許你不知道輸出的具體類型),你必須首先將每個包裝*interface{}在 a 中interface{}:
values := make([]interface{}, columnsCount)
for i := range values {
values[i] = new(interface{})
}
傳遞給...interface{}參數的單個值會自動包裝在 a 中interface{},但就像[]int...不會滿足一樣...interface{},也不會[]*interface{}...。
- 2 回答
- 0 關注
- 157 瀏覽
添加回答
舉報
0/150
提交
取消