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

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

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

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

Q&A

解決済

1回答

3890閲覧

Golangでhttp.HandleFunc()に登録した関数に値を渡す方法について

退会済みユーザー

退会済みユーザー

総合スコア0

Go

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

0グッド

0クリップ

投稿2017/06/09 09:20

以下のようにhttp.HandleFunc()に登録したhogeパッケージの関数Fuga()へ変数Valの値を渡したいのですが、そのような方法はあるのでしょうか?よろしくお願いします。

Go

1package main 2 3import "net/http" 4 5var Val = 123 6 7func main() { 8 http.HandleFunc("/hoge", hoge.Fuga) // ←hoge.Fuga()に変数Valの値を渡したい 9 http.ListenAndServe(":80", nil) 10}

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

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

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

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

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

guest

回答1

0

ベストアンサー

同一パッケージであればグローバル変数などで値を渡すことができますが、hoge.Fuga()となっているということは別のパッケージなんですね。

go

1http.HandleFunc("/hoge", func(w http.ResponseWriter, r *http.Request) { 2 hoge.Fuga(w, r, Val) 3})

ファーストオブジェクトであるためこのようなことができます。
hoge.Fuga関数は自己で定義したものですよね。定義自体を変える必要があるかと思います。

他にもhttp.Handlerインターフェースを実装した構造体を定義して、その値を予め書き換えることで値を渡すことができます。

  • 定義

go

1package hoge 2 3type MyHandler struct { 4 Val string 5} 6func (mh *MyHandler)ServeHTTP(w ResponseWriter, r *Request){ 7 // 処理 8} 9var Fuga = MyHandler{} 10
  • 利用

go

1package main 2 3import ( 4 "hoge" 5 "net/http" 6) 7 8func main(){ 9 http.Handle("/hoge", hoge.Fuga) 10 http.ListenAndServe(":80", nil) 11}

動作確認をしていないので動作はうまく行かないと思いますが、似たような状態で動作するかと思います。

投稿2017/06/13 04:03

intelf___

総合スコア868

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

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

退会済みユーザー

退会済みユーザー

2017/06/16 03:22

遅れましたが、回答どうもありがとうございました。 なるほど。その手があったか、、全然気がつきませんでした。 後者のほうは、あとで色々試してみようかと思います。とても参考になりました。
intelf___

2017/06/16 11:25

そうですね、前者はファーストオブジェクトの活用法(javascriptなども同じ書き方ができる) 後者の方は構造体、メソッド、インターフェースとGo言語固有のシステムへの理解が必要です。 前者のほうがシンプルでわかりやすいでしょう。つまりミスが減ります。 後者はインターフェースという縛りがあるので、複数のパッケージで記法、利用法を統一したいときはおすすめです。 hogeパッケージのようなものが他にいくつかある場合はこちらが適しているかと思います。 データを構造体で渡す場合は値の追加なども楽ですしね。 つまり、状況に応じて使い分けてください。
退会済みユーザー

退会済みユーザー

2017/06/25 00:28

コメントに気がつかず遅れましてすみません。ご丁寧にありがとうございました。バリバリ使わせてもらってます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問