为了账号安全,请及时绑定邮箱和手机立即绑定

golang导入结构指针

golang导入结构指针

Go
慕雪6442864 2021-05-12 13:58:26
好的,我有一个主包和一个http处理程序包。本质上,我想做的是设置一个全局结构,以便我可以随时调用该结构中的信息。下面是我尝试的示例的基本概述:主程序包导入处理程序函数主程序包调用handlerfunc Handlerfunc将http.ResponseWriter和其他项设置为UrlInfo结构Handlerfunc在函数中传递(不必将UrlStruct传递到函数中)Run函数(在此示例中为home)函数home可以随时调用变量uinfo导致其指针UrlInfo结构显然这是行不通的,但这本质上是我想这样做的方式,因此我不必将所有这些信息传递到我的home函数中。保持清洁和简单。任何想法都值得欢迎。谢谢。处理程序包package handler// Struct containing http requests and variablestype 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 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

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

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

通过在结构中对无关参数进行分组来保持代码干净很方便,但是对于您而言,我认为您不能(或应该)避免将UrlInfo结构的新实例直接home()作为参数传递。它将使事情变得不必要地复杂和不可预测。


查看完整回答
反对 回复 2021-05-17
  • 1 回答
  • 0 关注
  • 191 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信