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

Go で異なるシグネチャを持つ関数のスライスを作成するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-26 05:01:10389ブラウズ

How Can I Create a Slice of Functions with Different Signatures in Go?

異なるシグネチャを持つ関数のスライスの作成

問題

Go で異なるシグネチャを持つ関数のスライスを作成するにはどうすればよいですか?

Context

Go の型システムは静的に型付けされています。これは、関数がコンパイル時に固定シグネチャを持つ必要があることを意味します。ただし、さまざまな型や数値の引数を受け入れることができる関数のスライスを作成すると便利です。

解決策

提供されたコードは機能しますが、各引数を処理するには switch ステートメントを使用する必要があります。関数シグネチャのタイプ。より簡潔で柔軟な解決策は、リフレクションを使用することです。

次に例を示します:

package main

import (
    "fmt"
    "reflect"
)

type Executor func(...interface{})

func main() {
    functions := []Executor{
        func(a, b int) { fmt.Println(a + b) },
        func(s string) { fmt.Println(s) },
        func() { fmt.Println("No arguments") },
    }

    for _, f := range functions {
        numIn := reflect.TypeOf(f).NumIn()
        args := make([]reflect.Value, numIn)

        for i := 0; i < numIn; i++ {
            switch reflect.TypeOf(f).In(i).Kind() {
            case reflect.Int:
                args[i] = reflect.ValueOf(12)
            case reflect.String:
                args[i] = reflect.ValueOf("Hello")
            default:
                args[i] = reflect.Value{}
            }
        }

        f.Call(args)
    }
}

この解決策では、Executor 関数のスライスを作成します。これは、任意の数の関数を受け入れる関数です。引数。リフレクト パッケージは、各関数で予期される引数の数と型を決定し、対応するreflect.Value スライスを生成するために使用されます。

リフレクションを使用すると、型スイッチを必要とせずに、さまざまなシグネチャを持つ関数を動的に呼び出すことができます。またはインターフェイスのスライス。

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

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