質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

解決済

1回答

2948閲覧

Go言語で関数の定義名を取得する方法について

takuoki

総合スコア19

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

0クリップ

投稿2017/06/19 11:15

###Go言語で関数のオブジェクトを元に定義名を取得したい
現在、Echo(ver3.1.0)を用いてURLルーティングをしているのですが、
Middlewareにおいて、振分け先のハンドラに応じた処理分岐をしたいと思っています。
(具体的には、ハンドラ名を元に対象のjsonSchemaを取得し、バリデーションをかけたいと思っています。)

Middlewareにおいて、ContextからHandlerFuncを取得できるので、
reflectパッケージを用いれば、ここから関数の定義名を取得できるかと思っていたのですが、
今のところよいやり方が見つかっていません。

うまく関数の定義名を取得する方法、または上記の要件を満たせるような代替案をお持ちの方がいらっしゃれば、
ご教示いただけないでしょうか。

###試してみたソース
とあるサイトで関数名の取得方法として上がっていたソースを元に、以下のように書いてみました。

handlerName := runtime.FuncForPC(reflect.ValueOf(c.Handler).Pointer()).Name()

結果は、以下の通りです。

"github.com/labstack/echo.(Context).Handler-fm"

なお、以下のようにハンドラが定義されていた場合、Fooという文字列を取得したいです。
(パッケージ名等が付与されるくらいは問題ないです)

func Foo(c echo.Context) error { return nil }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

EchoのContextから取得できるPathが、URLそのものではなく
ルーティング指定時のパスとして取得できるため、こちらでハンドリング可能なことがわかりました。

func myMiddleware(next echo.HandlerFunc) echo.HandlerFunc { return func(c echo.Context) error { path := c.Path() switch path { case "/users/:id": // some logic } return next(c) } } func main() { e := echo.New() e.Use(myMiddleware) e.GET("/users/:id", getUser) e.Logger.Fatal(e.Start(":1323")) }

関数型の変数には無名の関数も格納できるので、
格納されている関数の名前を取得することはできないのかもしれないですね。

投稿2017/06/22 05:16

takuoki

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問