Go 開発のコンテキストでは、関数の署名をプログラムで次のように取得する必要があるシナリオに遭遇することがあります。文字列。これを実現する方法を理解することは、高度な型イントロスペクションとエラー処理を実行するために非常に重要です。
Go のリフレクト パッケージは、関数のreflect.Type を取得する機能を含む広範なリフレクション機能を提供します。ただし、reflect.Type.String() は型名のみを返すため、必ずしも十分な情報が提供されるわけではありません。
完全な関数署名を取得するには、reflect を詳しく調べる必要があります。 .Type を使用してパラメータと結果のタイプを手動で抽出します。これを行う関数は次のとおりです。
func signature(f interface{}) string { t := reflect.TypeOf(f) if t.Kind() != reflect.Func { return "<not a function>" } buf := strings.Builder{} buf.WriteString("func (") for i := 0; i < t.NumIn(); i++ { if i > 0 { buf.WriteString(", ") } buf.WriteString(t.In(i).String()) } buf.WriteString(")") if numOut := t.NumOut(); numOut > 0 { if numOut > 1 { buf.WriteString(" (") } else { buf.WriteString(" ") } for i := 0; i < t.NumOut(); i++ { if i > 0 { buf.WriteString(", ") } buf.WriteString(t.Out(i).String()) } if numOut > 1 { buf.WriteString(")") } } return buf.String() }
var myFunc ModuleInitFunc fmt.Println(signature(func(i int) error { return nil })) fmt.Println(signature(myFunc)) fmt.Println(signature(time.Now)) fmt.Println(signature(os.Open)) fmt.Println(signature(log.New)) fmt.Println(signature(""))
func (int) error func (int) error func () time.Time func (string) (*os.File, error) func (io.Writer, string, int) *log.Logger <not a function>
これに注意することが重要です。このアプローチでは、パラメーターの名前や結果の型はキャプチャされません。これは、Go が実行時にこの情報を保存しないためです。
以上がGo 関数の完全な署名をプログラムで文字列として取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。