首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将参数传递给HandlerFunc

将参数传递给HandlerFunc
EN

Stack Overflow用户
提问于 2012-04-09 05:23:12
回答 2查看 760关注 0票数 1

我正在尝试使用svgo package在svg文件上绘制点,并使用web浏览器显示它。从net/http文档来看,我不知道如何向svgWeb函数传递参数。

下面的示例编译并在我的web浏览器中显示了一个三角形和一条线,但我真正想做的是使用Polyline方法绘制xpt和ypt。如何传递适当的参数或重构此示例才能完成该任务?

代码语言:javascript
复制
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)
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-09 08:10:48

如果您的参数是由客户端提供的,那么它们应该通过http.Request传递给您的处理程序。

但是,如果您试图通过不是由客户端请求提供的点,而是由应用程序中的一些其他函数在内部生成这些值的点来驱动svgWeb处理程序,那么一种方法是将处理程序构造为结构并使用成员属性。

该结构可能如下所示:

代码语言:javascript
复制
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()
}

然后在你的main中:

代码语言:javascript
复制
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实例,该实例还可以包含其他处理程序,并且可以进行更新以影响其处理程序的输出。

满足 的

正如@Atom在注释中提到的,只需将方法重命名为ServeHTTP,就可以完全避免闭包和包装器。这将满足Handler interface的要求

代码语言:javascript
复制
func (m *SvgManager) ServeHTTP(w http.ResponseWriter, req *http.Request) {
    ...

manager := new(SvgManager)
http.Handle("/economy", manager)
票数 2
EN

Stack Overflow用户

发布于 2012-04-09 07:30:21

您应该将main中的函数定义为匿名函数。这样,它就可以引用局部变量xptsypts (该函数将是一个闭包)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10066643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档