在Go 中,可以藉助sql 來實作從資料庫取得行包,同時可以使用csv 套件來操作這些行並將它們寫入CSV 等文件中。然而,當表的架構未知且需要動態確定時,就會出現一個問題。
Rows 類型中的 Scan 方法期望欄位為基於表架構的特定類型。如果事先不了解此模式,則很難確定存在多少列及其類型。當嘗試將列讀入通用類型(例如 []string)時,這會帶來挑戰。
要解決此問題,需要使用 []interface{} 切片可用於指向 []string 切片中的每個字串。這是必要的,因為 Scan 需要一個指向目標變數的指標數組。以下程式碼片段示範了此方法:
package main import ( "database/sql" "fmt" "log" ) func main() { // Establish a connection to the database. db, err := sql.Open("mysql", "user:pass@tcp(localhost:3306)/test") if err != nil { log.Fatal(err) } defer db.Close() // Execute the "SELECT *" query. rows, err := db.Query("SELECT * FROM my_table") if err != nil { log.Fatal(err) } defer rows.Close() // Get the column names. cols, err := rows.Columns() if err != nil { log.Fatal(err) } // Create an interface{} slice pointing to each string in the []string slice. var readCols = make([]interface{}, len(cols)) var writeCols = make([]string, len(cols)) for i, _ := range writeCols { readCols[i] = &writeCols[i] } // Iterate over the rows and scan the columns into the string slice. for rows.Next() { if err := rows.Scan(readCols...); err != nil { log.Fatal(err) } fmt.Println(writeCols) } }
在此範例中,readCols 切片包含指向 writeCols 切片中每個元素的指標。當呼叫 Scan 時,行中的值被指派給 readCols 指向的變量,這些變數隨後被複製到 writeCols 切片中。這允許將資料庫中的列動態讀取到字串切片中。
以上是如何使用未知表模式將「SELECT *」列讀入 Go 中的 [] 字串?的詳細內容。更多資訊請關注PHP中文網其他相關文章!