ホームページ > バックエンド開発 > Golang > Go でさまざまなシグネチャを持つ関数のスライスを効率的に管理するにはどうすればよいですか?

Go でさまざまなシグネチャを持つ関数のスライスを効率的に管理するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-11-27 10:38:14
オリジナル
597 人が閲覧しました

How Can I Efficiently Manage Slices of Functions with Varying Signatures in Go?

さまざまなシグネチャを持つ関数のスライスの実装

問題:

Golang でさまざまなシグネチャを持つ関数のスライスを作成するのは挑戦的。提供されたコード スニペットを使用すると、このアプローチはいくぶん「巧妙」に見えます。回避策としてインターフェイス{} スライスを利用する必要がありますか?

解決策:

インターフェイス{} スライスの使用は、関数を含むスライスを作成するための有効な解決策です。さまざまな署名が付いています。ただし、別のアプローチでは、リフレクションを利用して各関数の入力パラメーターの数とタイプを動的に決定します。

リフレクションの使用を示す代替コード サンプルを次に示します。

package main

import (
    "fmt"
    "reflect"
)

func A() {
    fmt.Println("A")
}

func B(a int) {
    fmt.Println("B", a)
}

func C(a string, b float32) {
    fmt.Println("C", a, b)
}

func main() {
    f := []interface{}{A, B, C}

    for _, v := range f {
        fn := reflect.ValueOf(v)
        fmt.Printf("Function: %v\n", fn.Type())

        numArgs := fn.Type().NumIn()
        fmt.Printf("Number of arguments: %v\n", numArgs)

        for i := 0; i < numArgs; i++ {
            argType := fn.Type().In(i)
            fmt.Printf("Arg %v Type: %v\n", i+1, argType)
        }

        fmt.Printf("Calling function using reflection...\n")
        callArgs := []reflect.Value{}
        for i := 0; i < numArgs; i++ {
            switch fn.Type().In(i).Kind() {
            case reflect.Int:
                callArgs = append(callArgs, reflect.ValueOf(i+1))
            case reflect.String:
                callArgs = append(callArgs, reflect.ValueOf(fmt.Sprintf("Arg-%v", i+1)))
            case reflect.Float32:
                callArgs = append(callArgs, reflect.ValueOf(float32(i+1)))
            }
        }
        fn.Call(callArgs)
    }
}
ログイン後にコピー

このアプローチリフレクションを通じて個々の関数パラメータ (型と値の両方) への直接アクセスを提供し、異なるシグネチャを持つ関数のスライスをより動的に処理できるようにします。

以上がGo でさまざまなシグネチャを持つ関数のスライスを効率的に管理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート