1

svgo パッケージを使用して、svg ファイルにポイントをプロットし、Web ブラウザーを使用して表示しようとしています。ドキュメントを見るとnet/http、関数に引数を渡す方法がわかりませんsvgWeb

以下の例は、Web ブラウザーで三角形と線をコンパイルして表示しますが、実際にやりたいのは、Polyline メソッドを使用して xpts と ypts をプロットすることです。そのタスクを達成するために、適切な引数を渡したり、この例を再構成したりするにはどうすればよいですか?

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

2 に答える 2

2

引数がクライアントによって提供されることを意図している場合は、http.Request.

svgWebしかし、クライアント要求によって提供されたのではなく、これらの値を内部的に生成するアプリケーション内の他の関数によって提供されたポイントによってハンドラーを駆動することを試みている場合、1 つの方法は、ハンドラーを構造体に構造化することです。メンバー属性を使用します。

構造体は次のようになります。

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

次に、メインで:

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)

これで、他のハンドラーも含めることができる SvgManager インスタンスができ、更新してハンドラーの出力に影響を与えることができます。

Handler インターフェースを満たす

コメントで @Atom が述べたように、メソッドの名前を ServeHTTP に変更するだけで、クロージャーとラッパーを完全に回避できます。これはHandler インターフェースを満たします

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

manager := new(SvgManager)
http.Handle("/economy", manager)
于 2012-04-09T00:10:48.217 に答える
1

内部で関数mainを無名関数として定義する必要があります。このようにして、ローカル変数を参照できますxpts(ypts関数はクロージャになります)。

于 2012-04-08T23:30:20.870 に答える