Go에서는 SQL의 도움으로 데이터베이스에서 행을 가져올 수 있습니다. 패키지에서 이러한 행을 조작하고 CSV와 같은 파일에 쓰는 작업은 csv 패키지를 사용하여 수행할 수 있습니다. 그러나 테이블의 스키마를 알 수 없고 동적으로 결정해야 하는 경우 한 가지 문제가 발생합니다.
행 유형의 Scan 메서드는 필드가 다음과 같을 것으로 예상합니다. 테이블의 스키마를 기반으로 하는 특정 유형. 이 스키마에 대한 사전 지식이 없으면 존재하는 열 수와 해당 유형이 무엇인지 확인하기가 어렵습니다. 이는 열을 []문자열과 같은 일반 유형으로 읽으려고 할 때 문제가 됩니다.
이 문제를 극복하려면 []인터페이스{} 슬라이스 []문자열 슬라이스의 각 문자열을 가리키는 데 사용할 수 있습니다. 이는 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 슬라이스에 복사됩니다. 이를 통해 데이터베이스의 열을 문자열 조각으로 동적으로 읽을 수 있습니다.
위 내용은 알 수 없는 테이블 스키마를 사용하여 Go에서 'SELECT *' 열을 []문자열로 읽는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!