2017-10-01 14 views
-1

与えられた例では文字列をハンドラに渡そうとしています。ここで http関数の追加引数Golang

package main 
import (
"fmt" 
"net/http" 
) 

func handler(w http.ResponseWriter, r *http.Request) { 
    fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:]) 
} 

func main() { 
    http.HandleFunc("/", handler) 
    http.ListenAndServe(":8080", nil) 
} 

は、私が試したものですが、それは、引数の定期的な数を予想して、エラーがスローされます。

package main 
import (
"fmt" 
"net/http" 
) 

func handler(w http.ResponseWriter, r *http.Request, s *string) { 
    fmt.Fprintf(w, "Hi there, I love %s!", *s) 
} 

func main() { 
    files := "bar" 
    http.HandleFunc("/", handler(&files)) 
    http.ListenAndServe(":8080", nil) 
} 

答えて

2

私はあなたのように渡したいデータをカプセル化しようとしない理由は、あなたが何をしようとしてにはほとんど不明でんだけど、あなたが言ったことをオフに基づいて、これは

package main 
import (
    "fmt" 
    "net/http" 
) 

type FilesHandler struct { 
    Files string 
} 

func (fh *FilesHandler) handler(w http.ResponseWriter, r *http.Request) { 
    fmt.Fprintf(w, "Hi there, I love %s!", fh.Files) 
} 

func main() { 
    myFilesHandler := &FilesHandler{Files: "bar"} 
    http.HandleFunc("/", myFilesHandler.handler) 
    http.ListenAndServe(":8080", nil) 
} 

これは、あなたがハンドラに提供するものを少し細かく制御します。

+0

私はこの答えが本当に好きですが、文字列の配列に変換する方法がわかりません。 – GoHttp

+0

'Files strings'を' Files [] string'に変更し、あなたの配列で構造体をインスタンス化してください。 –

+0

ファイルを動的に取得したい場合は、 'func(fh * FilesHandler)GetFiles()[] string {//ファイルの文字列配列を取得するためのもの}'のような別の関数を追加し、 'handler' 'fh.GetFiles()'のように –

1

オプションの多くは、あなたは可能性がここにあります

  • 使用A閉じたハンドラの状態を設定するためのクロージャ
  • ハンドラの構造体のメソッドを使用し、そこにグローバルな状態を設定します。
  • はそれが思ったほど複雑ではない、おそらく良くありません(新しい署名を使用して独自のルータを書く値を格納するグローバル・パッケージを使用し
  • それを得る
  • 、その後、値を格納する要求コンテキストを使用しますそれは別のパッケージに属している、それはいくつかの状態に基づいており、それが一定である - という考え)
  • は、それはsが本当に何であるかによって異なりURL

から抽出のparamsのようなものを行うためのヘルパー関数を書きます?

+0

私はファイルから読み込む予定の文字列配列を作成しようとしています。そして、ポストリクエストが出てくるので配列の値をチェックします。 – GoHttp

+0

与えられた配列をハンドラに渡す必要があります。もしそれがポインタで行えるのであれば本当に良いでしょう。 – GoHttp

+0

私はそれを行う方法のいくつかの例を教えていただけますか? – GoHttp

0

な方法の一つは、グローバル変数にデータを格納することです。

package main 

import (
    "fmt" 
    "net/http" 
) 

var replies map[string]string 

func handler1(w http.ResponseWriter, r *http.Request) { 
    r.ParseForm() 
    question := r.FormValue("question") 
    var answer string 
    var ok bool 
    if answer, ok = replies[question]; !ok { 
     answer = "I have no answer for this" 
    } 
    fmt.Fprintf(w, "Hi there, I love %s! My answer is: %s", question, answer) 
} 

func main() { 
    //files := "bar" 
    replies = map[string]string{ 
     "UK": "London", 
     "FR": "Paris", 
    } 
    http.HandleFunc("/", handler1) 
    http.ListenAndServe(":8080", nil) 
} 

ここで私は、ファイルをコメントアウトし、マップにあるように、データを入れている簡潔にするため。ファイルを読んでそこに置くことができます。 CURLと

使用法:

$ curl -X POST 127.0.0.1:8080/ -d "question=FR" 
Hi there, I love FR! My answer is: Paris 

$ curl -X POST 127.0.0.1:8080/ -d "question=US" 
Hi there, I love US! My answer is: I have no answer for this 
関連する問題