Reflection을 사용하여 Scan() Variadic 함수 호출
Rows.Scan() 함수는 데이터베이스에서 데이터를 검색하는 편리한 방법을 제공합니다. 질문. 그러나 가변 개수의 포인터를 인수로 사용하므로 리플렉션을 사용하여 통합하기 어려울 수 있습니다. 다음 시나리오를 고려하십시오.
쿼리에서 얻은 값으로 조각을 동적으로 채우고 Rows.Scan()을 활용하여 데이터를 추출하려고 합니다. 이 경우 열 수를 결정하고 값을 저장할 조각을 만들어야 합니다.
일반적인 함정:
리플렉션을 사용하여 Scan() 함수는 예상치 못한 결과를 초래할 수 있습니다. 이는 Rows.Scan()이 값에 대한 포인터를 예상하고 단순히 인터페이스 값 조각을 전달하면 참조가 전혀 발생하지 않기 때문입니다.
해결책:
리플렉션을 사용하여 Scan()을 성공적으로 호출하려면 이중 슬라이스 접근 방식이 사용됩니다. 첫 번째 조각인 value는 실제 데이터를 보유하고 두 번째 조각인 valuePtrs는 값의 각 요소에 대한 포인터를 포함합니다.
쿼리 결과의 각 열에 대해 valuePtrs의 포인터는 해당 요소에 매핑됩니다. 가치에. 이후에 ValuePtrs를 인수로 사용하여 Rows.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) valuesPtrs := make([]interface{}, count) for rows.Next() { for i := range columns { valuesPtrs[i] = &values[i] } rows.Scan(valuesPtrs...) 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) } } }
이 예에서는 행입니다. Scan()은 포인터 슬라이스 valuePtrs를 사용하여 호출되어 값 슬라이스를 검색된 데이터로 채웁니다. 그런 다음 루프는 각 열 이름과 해당 값을 인쇄합니다.
위 내용은 리플렉션을 사용하여 데이터베이스/SQL Rows.Scan() Variadic 함수를 호출하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!