Go で関数の署名を文字列として取得する
Go では、特定の名前と署名を持つ関数の署名を、 main パッケージは、次のような場合に有益なエラー メッセージを提供するために重要です。不一致。
Reflect.Type.String() は署名を取得できますか?
Reflect.Type.String() は型の名前 (main.ModuleInitFunc など) を提供します。 、完全な署名を提供するには不十分です。これは、名前付き型を持つ関数値を扱う場合に特に顕著です。
署名の構築
署名を構築するには、reflect.Type から手動で情報を収集する必要があります。 .
実装例
以下は関数の署名を生成する関数の例ですvalue:
func signature(f interface{}) string { t := reflect.TypeOf(f) if t.Kind() != reflect.Func { return "<not a function>" } ... return buf.String() }
この関数は、入力型と出力型を反復処理し、人間が判読できる文字列に組み立てることによって署名を構築します。
署名関数のテスト
署名関数をテストすると、次の結果が得られます。 results:
fmt.Println(signature(func(i int) error { return nil })) // func (int) error fmt.Println(signature(myFunc)) // func (int) error fmt.Println(signature(time.Now)) // func () time.Time fmt.Println(signature(os.Open)) // func (string) (*os.File, error) fmt.Println(signature(log.New)) // func (io.Writer, string, int) *log.Logger fmt.Println(signature("")) // <not a function>
Go はパラメーター名と結果の型名へのアクセスを提供しないため、それらは署名から省略されることに注意することが重要です。
以上がGo 関数の署名を文字列として取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。