Go で異なるシグネチャを持つ関数のスライスを作成するにはどうすればよいですか?
Nov 26, 2024 am 05:01 AM異なるシグネチャを持つ関数のスライスの作成
問題
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 サイトの他の関連記事を参照してください。

人気の記事

人気の記事

ホットな記事タグ

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











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

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

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

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

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

Linterと静的分析ツールを使用して、GOコードの品質と保守性を向上させるにはどうすればよいですか?
