> 백엔드 개발 > Golang > 리플렉션을 사용하여 데이터베이스/SQL Rows.Scan() Variadic 함수를 호출하는 방법은 무엇입니까?

리플렉션을 사용하여 데이터베이스/SQL Rows.Scan() Variadic 함수를 호출하는 방법은 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-12-05 09:56:11
원래의
756명이 탐색했습니다.

How to Use Reflection to Call the Database/SQL Rows.Scan() Variadic Function?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿