Go에서 Reflection을 사용하여 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 슬라이스는 다음의 주소로 채워집니다. 값 조각의 각 요소. 그런 다음 row.Scan() 메서드가 valuePtrs 슬라이스와 함께 호출되어 현재 행의 데이터로 값 슬라이스를 효과적으로 채웁니다.
마지막으로 코드는 열 이름과 값을 반복하여 바이트 슬라이스를 다음으로 변환합니다. 필요한 경우 문자열을 추가하고 결과를 인쇄합니다.
위 내용은 Go Reflection을 사용하여 동적 포인터 수로 'Scan' Variadic 함수를 호출하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!