在 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中文网其他相关文章!