gpt4 book ai didi

svg - 将参数传递给 HandlerFunc

转载 作者:IT王子 更新时间:2023-10-29 02:00:24 26 4
gpt4 key购买 nike

我正在尝试使用 svgo package在 svg 文件上绘制点并使用网络浏览器显示。通过查看 net/http 文档,我不知道如何将参数传递到我的 svgWeb 函数中。

下面的示例在我的网络浏览器中编译并显示了一个三角形和一条线,但我真正想做的是使用 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)
}
}

最佳答案

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

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

结构可能如下所示:

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 interface

正如@Atom 在评论中提到的,您可以通过简单地将您的方法重命名为 ServeHTTP 来完全避免闭包和包装器。这将满足 Handler interface

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

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

关于svg - 将参数传递给 HandlerFunc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10066643/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com