golang import struct pointer

时间:2012-09-28 22:20:40

标签: go

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

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

显然这不起作用,但这基本上是我想做的,所以我不必将所有这些信息传递到我的家庭功能。保持清洁和简单。

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

处理程序包

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

1 个答案:

答案 0 :(得分:4)

根据我从你的问题收集的内容,你试图定义一个结构的单个全局实例,除其他外,它包含对当前Request和ResponseWriter的引用。

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

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