2012-04-08 12 views
1

Ich versuche, die svgo package zu verwenden, um Punkte in einer Svg-Datei zu zeichnen und diese mit dem Webbrowser anzuzeigen. Aus der Betrachtung der net/http Dokumentation weiß ich nicht, wie ich Argumente in meine svgWeb Funktion übergeben könnte.Argumente in HandlerFunc übergeben

Das folgende Beispiel kompiliert und zeigt ein Dreieck und eine Linie in meinem Web-Browser, aber was ich wirklich gerne tun würde ist plotten xpts und ypts mit der Polyline-Methode. Wie kann ich die entsprechenden Argumente übergeben oder dieses Beispiel umstrukturieren, um diese Aufgabe zu erfüllen?

package main 

import (
    "github.com/ajstarks/svgo" 
    "log" 
    "net/http" 
) 

func svgWeb(w http.ResponseWriter, req *http.Request) { 
    w.Header().Set("Content-Type", "image/svg+xml") 

    xpts := []int{1, 200, 5} 
    ypts := []int{200, 400, 300} 
    s := svg.New(w) 
    s.Start(500, 500) 
    s.Line(5, 10, 400, 400, "stroke:black") 
    s.Polyline(xpts, ypts, "stroke:black") 
    s.End() 
} 

//// Main Program function 
////////////////////////////// 

func main() { 

    xpts := []int{} 
    ypts := []int{} 

    for i := 0; i < 100; i++ { 
     xpts = append(xpts, i) 
     xpts = append(ypts, i+5) 
    } 

    http.Handle("/economy", http.HandlerFunc(svgWeb)) 
    err := http.ListenAndServe(":2003", nil) 
    if err != nil { 
     log.Fatal("ListenAndServe:", err) 
    } 
} 
+1

Ich bin verwirrt. Wenn Sie 'net/http' verwenden, um einen Handler zu erstellen, warum würden Sie dann nicht einfach Ihre Argumente von der' http.request' im Handler bekommen? Was ist die beabsichtigte Verwendung? – jdi

Antwort

2

Wenn Ihre Argumente vom Client bereitgestellt werden sollen, sollten sie über die http.Request an Ihren Handler übergeben werden.

Wenn Sie jedoch versuchen, Ihren svgWeb -Handler nach Punkten zu steuern, die nicht von der Clientanforderung bereitgestellt werden, sondern von einigen anderen Funktionen in Ihrer Anwendung, die diese Werte intern generieren, dann wäre eine Möglichkeit, zu strukturieren Ihr Handler in eine Struktur und verwendet Mitgliedsattribute.

Die Struktur kann wie folgt aussehen:

type SvgManager struct { 
    Xpts, Ypts []int 
} 

func (m *SvgManager) SvgWeb(w http.ResponseWriter, req *http.Request) { 
    w.Header().Set("Content-Type", "image/svg+xml") 

    s := svg.New(w) 
    s.Start(500, 500) 
    s.Line(5, 10, 400, 400, "stroke:black") 
    s.Polyline(m.Xpts, m.Ypts, "stroke:black") 
    s.End() 
} 

dann in der Haupt:

manager := new(SvgManager) 

for i := 0; i < 100; i++ { 
    manager.Xpts = append(manager.Xpts, i) 
    manager.Ypts = append(manager.Ypts, i+5) 
} 

// I only did this assignment to make the SO display shorter in width. 
// Could have put it directly in the http.Handle() 
handler := http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { 
    manager.SvgWeb(w, req) 
}) 
http.Handle("/economy", handler) 

Jetzt haben Sie eine SvgManager Instanz, die auch andere Handler enthalten könnten, und kann aktualisiert werden, beeinflussen die Ausgabe ihrer Handler.

die Handler interface

Satisfying Wie in den Kommentaren von @Atom erwähnt, könnten Sie den Verschluss und die Hülle durch einfaches Umbenennen Ihrer Methode zu ServeHTTP vollständig vermeiden. Dies würde die Handler interface

func (m *SvgManager) ServeHTTP(w http.ResponseWriter, req *http.Request) { 
    ... 

manager := new(SvgManager) 
http.Handle("/economy", manager) 
+2

Wenn die SvgManager-Methode 'SvgWeb' in' ServeHTTP' umbenannt wird, implementiert SvgManager die 'net/http.Handler'-Schnittstelle und kann direkt an 'http.Handle' übergeben werden. –

+0

@Atom: guten Ruf. Ich werde das hinzufügen – jdi

1

Sie sollten Ihre Funktion innerhalb main als eine anonyme Funktion definieren. Auf diese Weise kann es sich auf die lokalen Variablen xpts und ypts beziehen (die Funktion wird eine Schließung sein).

Verwandte Themen