"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 반사를 사용하여 데이터베이스/sql rows.scan () variadic 함수를 호출하는 방법?

반사를 사용하여 데이터베이스/sql rows.scan () variadic 함수를 호출하는 방법?

2025-02-06에 게시되었습니다
검색:556

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

반사를 사용하여 scan () variadic 함수를 호출

rows.scan () 함수는 데이터베이스에서 데이터를 검색하는 편리한 방법을 제공합니다. 질문. 그러나 변수의 포인터를 인수로 사용하여 반사를 사용하는 데 어려움을 겪을 수 있습니다. 다음 시나리오를 고려하십시오 :

쿼리에서 얻은 값으로 슬라이스를 동적으로 채우고 rows.scan ()을 사용하여 데이터를 추출하려고합니다. 이 경우 열의 수를 결정하고 값을 저장하기 위해 슬라이스를 만들어야합니다.
일반적인 함정 :

반사를 사용하여 호출을 시도합니다. 스캔 () 함수는 예상치 못한 결과로 이어질 수 있습니다. rows.scan ()는 값에 대한 포인터를 기대하고 인터페이스 {} 값 조각을 단순히 전달하기 때문에 참조가 될 것입니다. ] 반사와 함께 Scan ()을 성공적으로 호출하려면 이중 슬라이스 접근 방식이 사용됩니다. 첫 번째 슬라이스 인 값은 실제 데이터를 보유하는 반면, 두 번째 슬라이스 인 valesptrs에는 각 요소에 값이 포함되어 있습니다. 값으로. 그 후, rows.scan ()는 valuesptrs를 인수하여 값을 효과적으로 채우고 값을 효과적으로 채울 수 있습니다. 수입 (수입) "FMT" _ "github.com/lib/pq" "데이터베이스/SQL" )) func main () { db, _ : = sql.open ( "Postgres", "user = postgres dbname = go_testing password = pass sslmode = disable") 행, _ : = db.query ( "select * from _user;") 열, _ : = rows.columns () 카운트 : = Len (열) 값 : = make ([] interface {}, count) valuesptrs : = make ([] interface {}, count) rows.next () { i : = 범위 열 { valuesptrs [i] = & value [i] } rows.scan (valesptrs ...) i, col : = 범위 열 { val : = 값 [i] b, ok : = val. ([] byte) var v 인터페이스 {} if (ok) { v = 문자열 (b) } 또 다른 { v = val } fmt.println (col, v) } } } 이 예에서는 rows.scan ()가 포인터 슬라이스 valuesptrs와 함께 호출되어 값을 검색된 데이터로 채 웁니다. 루프는 각 열 이름과 해당 값을 인쇄합니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3