Go 中透過反射呼叫Scan Variadic 函數
database/sql 套件中Row 介面的Scan() 方法可以高效檢索透過將指針的可變參數清單傳遞給正確類型的值來取得資料庫行中的值。雖然很有用,但使用反射從可變數量的指標獲取值的方法可能具有挑戰性。
解決方案
提供的解決方案透過動態建立來克服這項挑戰兩個切片:一個用於儲存值,另一個用於保存並行指針。使用指標收集值切片中的資料可以填入其他資料結構。
程式碼
package main import ( "fmt" _ "github.com/lib/pq" "database/sql" ) func main() { db, _ := sql.Open( "postgres", "user=postgres dbname=go_testing password=pass sslmode=disable") rows, _ := db.Query("SELECT * FROM _user;") columns, _ := rows.Columns() count := len(columns) values := make([]interface{}, count) valuePtrs := make([]interface{}, count) for rows.Next() { for i := range columns { valuePtrs[i] = &values[i] } rows.Scan(valuePtrs...) for i, col := range columns { val := values[i] b, ok := val.([]byte) var v interface{} if (ok) { v = string(b) } else { v = val } fmt.Println(col, v) } } }
程式碼先開啟與資料庫的連線並執行一個查詢。然後,它確定結果集中的列數,並建立兩個切片:values 和 valuePtrs,其長度與列相同。
在行循環內,valuePtrs 切片填入值切片中的每個元素。然後使用 valuePtrs 切片呼叫 rows.Scan() 方法,有效地使用目前行的資料填入值切片。
最後,程式碼迭代列名稱和值,將位元組切片轉換為如果需要的話字串,並列印結果。
以上是如何有效率地使用 Go 反射來呼叫具有動態數量指標的'Scan”可變參數函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!