3

好的,我有一个主包和一个 http 处理程序包。本质上,我要做的是设置一个全局结构,这样我就可以随时调用该结构中的信息。

下面是我尝试的示例的基本概述: 主包导入处理函数 主包调用 handlerfunc Handlerfunc 将 http.ResponseWriter 和其他项目设置为 UrlInfo struct Handlerfunc 运行传入函数(无需将 UrlStruct 传递给函数) 运行函数(本例中为 home)函数 home 可以随时调用变量 uinfo 导致其指针 UrlInfo 结构

显然这不起作用,但这本质上是我想做的,这样我就不必将所有这些信息传递到我的家庭功能中。保持干净和简单。

欢迎任何想法和想法。谢谢。

处理程序包

package handler

// Struct containing http requests and variables
type UrlInfo struct {
    Res http.ResponseWriter
    Req *http.Request
    Item string
}

func HandleFunc(handlepath string, runfunc func()) {
    // Set handler and setup struct
    http.HandleFunc(handlepath, func(w http.ResponseWriter, r *http.Request) {
        url := new(UrlInfo)
        url.Res = w
        url.Req = r
        url.Item = "Item information"

        runfunc()
    })
}

主包

import "handler"

var uinfo = &handler.UrlInfo{}

func init() {
    handler.HandleFunc("/home/", home)
}

func home() {
    fmt.Println(uinfo.Item)
}
4

1 回答 1

5

根据我从您的问题中收集到的信息,您正在尝试定义一个结构的单个全局实例,其中包含对当前 Request 和 ResponseWriter 的引用。

如果这是意图,我应该警告你这会导致问题。Go 的 http 包在单独的 goroutine 中执行每个请求处理程序。这意味着您可以同时处理任意多个请求。因此,它们不能都安全地引用同一个全局结构并期望它包含仅与该特定请求相关的请求信息。如果您希望您的服务器是线程安全的,则不应使用全局实例。

通过在结构中分组无关参数来保持代码清洁可能很方便,但在您的情况下,我不相信您可以(或应该)避免将UrlInfo结构的新实例直接home()作为参数传递。它会使事情变得不必要的复杂和不可预测。

于 2012-09-29T00:28:43.790 回答