ホームページ バックエンド開発 Golang Go Reflection を効率的に使用して、動的な数のポインターを使用して「Scan」可変引数関数を呼び出すにはどうすればよいですか?

Go Reflection を効率的に使用して、動的な数のポインターを使用して「Scan」可変引数関数を呼び出すにはどうすればよいですか?

Dec 10, 2024 am 12:21 AM

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

Go でリフレクションを使用した Scan Variadic 関数の呼び出し

データベース/SQL パッケージの Row インターフェイスの Scan() メソッドを使用すると、正しい型の値へのポインターの可変引数リストを渡すことによって、データベース行から値を取得します。便利ではありますが、リフレクションを使用して可変数のポインターから値を取得するこのメソッドの操作は困難な場合があります。

ソリューション

提供されているソリューションは、動的に2 つのスライス: 1 つは値の保存用、もう 1 つは並列ポインターの保持用です。ポインタを使用して値スライス内のデータを収集すると、他のデータ構造を取り込むことができます。

コード

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)
        }
    }
}
ログイン後にコピー

コードは、まずデータベースへの接続を開き、実行します。クエリ。次に、結果セット内の列の数を決定し、列と同じ長さの 2 つのスライス、values と valuePtrs を作成します。

行のループ内で、valuePtrs スライスには次のアドレスが設定されます。値スライスの各要素。次に、valuePtrs スライスを使用して rows.Scan() メソッドが呼び出され、現在の行のデータが値スライスに効果的に設定されます。

最後に、コードは列名と値を反復処理して、バイト スライスを次のように変換します。必要に応じて文字列を入力し、結果を出力します。

以上がGo Reflection を効率的に使用して、動的な数のポインターを使用して「Scan」可変引数関数を呼び出すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか? Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか? Mar 03, 2025 pm 05:17 PM

Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか?

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか? GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか? Mar 10, 2025 pm 05:38 PM

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか?

Beegoフレームワークのページ間で短期情報転送を実装する方法は? Beegoフレームワークのページ間で短期情報転送を実装する方法は? Mar 03, 2025 pm 05:22 PM

Beegoフレームワークのページ間で短期情報転送を実装する方法は?

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか? トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか? Mar 10, 2025 pm 05:36 PM

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか?

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか? GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか? Mar 10, 2025 pm 03:20 PM

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか?

Go言語でファイルを便利に書く方法は? Go言語でファイルを便利に書く方法は? Mar 03, 2025 pm 05:15 PM

Go言語でファイルを便利に書く方法は?

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は? MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は? Mar 03, 2025 pm 05:18 PM

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は?

GOの実際のパフォーマンスを正確に反映するベンチマークを作成するにはどうすればよいですか? GOの実際のパフォーマンスを正確に反映するベンチマークを作成するにはどうすればよいですか? Mar 10, 2025 pm 05:36 PM

GOの実際のパフォーマンスを正確に反映するベンチマークを作成するにはどうすればよいですか?

See all articles