> 백엔드 개발 > Golang > Go에서 리플렉션을 사용하여 Variadic Rows.Scan()을 동적으로 호출하는 방법은 무엇입니까?

Go에서 리플렉션을 사용하여 Variadic Rows.Scan()을 동적으로 호출하는 방법은 무엇입니까?

DDD
풀어 주다: 2024-12-04 00:58:13
원래의
937명이 탐색했습니다.

How to Dynamically Call Variadic Rows.Scan() Using Reflection in Go?

SQL 스캔을 위해 리플렉션을 사용하여 Variadic 함수 호출

SQL 데이터베이스 쿼리에 Rows.Scan() 함수를 활용하는 경우 다음이 필요합니다. 리플렉션을 사용하여 허용되는 포인터의 가변 수를 설명합니다. 이를 통해 쿼리 결과의 데이터로 슬라이스를 동적으로 채울 수 있습니다.

리플렉션을 사용하여 동적으로 스캔하는 단계

리플렉션을 사용하여 Rows.Scan()과 같은 가변 함수를 호출하려면 , 다음 단계를 따르세요.

  1. 열 얻기 정보: columns.Columns()를 사용하여 열 이름을 검색합니다.
  2. 조각 만들기: 두 개의 조각을 만듭니다. 하나는 값(values)용이고 다른 하나는 포인터(valuePtrs)용입니다. 열의 길이와 일치합니다.
  3. 데이터 스캔: 결과의 각 행에 대한 루프에서 설정하고 각 열을 반복하고 valuePtrs 슬라이스에 포인터를 할당합니다. 그런 다음 행.Scan(valuePtrs...)을 호출합니다.
  4. 값 검색: 스캔 후에는 값 슬라이스에서 데이터를 사용할 수 있습니다. 필요한 경우 []바이트를 문자열로 변환합니다.

코드 예

다음 코드 조각은 리플렉션을 사용하여 동적으로 스캔하는 방법을 보여줍니다.

package main

import (
    "fmt"
    _ "github.com/lib/pq"
    "database/sql"
)

func main() {
    db, _ := sql.Open("postgres", "connection_string")
    rows, _ := db.Query("SELECT * FROM my_table")

    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)
        }
    }
}
로그인 후 복사

이 방법을 구현하면 데이터 유형을 지정하지 않고도 쿼리 결과로 조각을 동적으로 채울 수 있습니다. 미리.

위 내용은 Go에서 리플렉션을 사용하여 Variadic Rows.Scan()을 동적으로 호출하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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