首頁 > 後端開發 > Golang > 如何有效率地使用 Go 反射來呼叫具有動態數量指標的'Scan”可變參數函數?

如何有效率地使用 Go 反射來呼叫具有動態數量指標的'Scan”可變參數函數?

Susan Sarandon
發布: 2024-12-10 00:21:14
原創
849 人瀏覽過

How Can I Efficiently Use Go Reflection to Call the `Scan` Variadic Function with a Dynamic Number of Pointers?

Go 中透過反射呼叫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 切片填入值切片中的每個元素。然後使用 valuePtrs 切片呼叫 rows.Scan() 方法,有效地使用目前行的資料填入值切片。

最後,程式碼迭代列名稱和值,將位元組切片轉換為如果需要的話字串,並列印結果。

以上是如何有效率地使用 Go 反射來呼叫具有動態數量指標的'Scan”可變參數函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板