Golang 导入结构体指针

3
我有一个主要的包和一个HTTP处理程序包,两者都与IT技术有关。基本上,我想设置一个全局结构体,以便可以随时调用该结构体中的信息。
以下是我尝试的示例的基本概述: 主包导入处理程序功能 主包调用handlerfunc Handlerfunc将http.ResponseWriter和其他项目设置到UrlInfo结构中 Handlerfunc运行传递进来的函数(无需将UrlStruct传递到函数中) 运行函数(在此示例中为home) Home函数可以随时调用uinfo变量,因为它是指向UrlInfo结构的指针
显然,这并不起作用,但这基本上是我想要做的,这样我就不必将所有这些信息传递到我的home函数中。使其简洁明了。
欢迎提出任何想法和建议。谢谢。
处理程序包
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)
}

我不确定这里的问题是什么 :-) - Jeremy Wall
1个回答

5
根据您的问题,我理解您正在尝试定义一个结构的单个全局实例,其中包括对当前请求和ResponseWriter的引用。
如果这是您的意图,我应该警告您,这将会引起问题。Go的http包在单独的goroutine中执行每个请求处理程序。这意味着您可以同时处理任意数量的请求。因此,它们不能都安全地引用同一个全局结构,并期望它仅包含特定请求相关的请求信息。如果您希望服务器线程安全,则不应使用全局实例。
通过将杂项参数分组到结构中来保持代码清晰可能很方便,但在您的情况下,我认为您无法(也不应该)避免将UrlInfo结构的新实例直接作为参数传递给home()。这将使事情变得不必要复杂且不可预测。

有道理。我想我生活在太多的PHP世界中。应该有人组织一些东西来帮助PHP开发人员弥合PHP和Go之间的差距。 - Brian Voelker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接