2017-10-01 5 views
-1

Ich versuche String an Handler im gegebenen Beispiel zu übergeben. HierZusätzliche Argumente für die http-Funktion 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) 
} 

ist, was ich versucht, aber es wirft einen Fehler, da es regelmäßige Anzahl der Argumente erwartet:

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) 
} 

Antwort

2

Ich bin ein wenig unklar, was Sie zu tun versuchen, sondern auf der Grundlage weg, was Sie gesagt haben, warum nicht versuchen, die Daten, die Sie wie passieren in möchten einzukapseln dies:

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) 
} 

Dies bietet eine etwas genauere Kontrolle darüber, was Sie Ihrem Handler zur Verfügung stellen.

+0

Ich mag diese Antwort wirklich, aber ich bin nicht sicher, wie man es in ein Array von Strings <. <. – GoHttp

+0

Ändern Sie einfach 'Files string' in' Files [] string' und instanziieren Sie die Struktur mit Ihrem Array. –

+0

Wenn Sie die Dateien dynamisch abrufen möchten, können Sie einfach eine andere Funktion hinzufügen wie 'func (fh * FilesHandler) GetFiles() [] string {// Machen Sie etwas, um Ihr String-Array von Dateien zu erhalten}' und rufen Sie es in 'handler' auf wie 'fh.GetFiles()' –

1

Es gibt viele Möglichkeiten hier, man konnte:

  • Verwenden Sie ein Abschluss, um den Status für den eingeschlossenen Handler zu setzen
  • Verwenden Sie eine Methode für eine Struktur für den Handler, und setzen Sie dort den globalen Status
  • Verwenden Sie den Anforderungskontext einen Wert zu speichern, ist es dann raus
  • ein Paket verwendet global den Wert
  • Schreiben Sie Ihren eigenen Router mit einer neuen Signatur zu speichern (nicht so komplex wie es klingt, aber wahrscheinlich nicht gut idea)
  • eine Hilfsfunktion schreiben Dinge wie Extrakt params aus der uRL

es hängt zu tun, was s wirklich ist - ist es eine konstante ist, es auf einigen Zustand basiert, macht es in einem separaten Paket gehören ?

+0

Ich versuche, ein String-Array zu erstellen, das aus der Datei lesen wird und dann, wenn die Post-Anforderung kommt, wird es das Array nach Werten überprüfen. – GoHttp

+0

Ich muss übergeben Array an Handler übergeben. Es wäre wirklich gut, wenn es per Zeiger gemacht werden könnte. – GoHttp

+0

Können Sie mir einige Beispiele geben, wie es geht? – GoHttp

0

Eine der Weisen ist, Daten in globalen Variablen zu speichern:

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) 
} 

hier der Kürze halber habe ich Dateien kommentiert und Daten setzen, wie in der Karte ist. Sie können die Datei lesen und dort ablegen.

Verwendung mit 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 
Verwandte Themen