当前位置: 首页 > 面试题库 >

golang导入结构指针

仉成益
2023-03-14
问题内容

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

下面是我尝试的示例的基本概述:主程序包导入处理程序函数主程序包调用handlerfunc
Handlerfunc将http.ResponseWriter和其他项设置为UrlInfo结构Handlerfunc在函数中传递(不必将UrlStruct传递到函数中)Run函数(在此示例中为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)
}

问题答案:

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

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

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



 类似资料:
  • Go 语言中指向结构体的指针和 C 语言一样 结构体和指针 创建结构体指针变量有两种方式 package main import "fmt" type Student struct { name string age int } func main() { // 创建时利用取地址符号获取结构体变量地址 var p1 = &Student{"lnj", 33}

  • 问题内容: 是否可以在不使用嵌入式结构的情况下继承类型的方法? 代码的第一个片段是将结构嵌入其中的工作代码,我可以在上调用该方法。我不喜欢的是,当我初始化时,我有(?)来初始化其中的结构。有没有解决的办法? 最终,我想做以下事情。where 是类型和初始化位置,也不需要初始化结构。以下代码不起作用,但可能清楚我的目标是什么。 我将添加更多使用的方法的结构,这就是我要问的原因。如果只拥有,我将拥有可

  • 问题内容: 我有以下几种类型: 我可以使用use ,但是我 不能 使用 似乎可以嵌入语法,但是使用它无效吗? 问题答案: 嵌入式类型是(未命名的)字段,由不合格的类型名称引用。 规格:结构类型: 使用类型但没有显式字段名称声明的字段是 匿名字段 ,也称为 嵌入式 字段或该类型在结构中的嵌入。必须将嵌入式类型指定为类型名称或指向非接口类型名称的指针,并且本身不能为指针类型。 非限定类型名称充当字段名

  • Go 语言中的结构体和 C 语言中结构体一样,都是用来保存一组 不同类型的数据 Go 语言中的结构体和 C 语言中结构体一样,都需要先定义结构体类型再利用结构体类型定义结构体变量 定义结构体类型 type 类型名称 struct{ 属性名称 属性类型 属性名称 属性类型 ... ... } type Studentstruct { name string age int

  • 通过Three.js模型数据导入导出过程的学习,可以让你对Threejs解析加载外部模型的过程更为了解。 Threejs导出模型信息 你可以通过下面代码导出模型的各类信息,然后在浏览器控制台打印出来模型数据,然后复制浏览器控制台模型数据粘贴到json文件中,最后可以尝试加载解析这些Threejs导出的json文件。之所以这么做,是为了让你理解其它三维软件,比如3dmax、blender软件导出的三

  • 问题内容: 我有以下代码: 我想做的是创建一个Writer接口来包装,因为它没有命名为“ Write”,并且我不能将其与任何需要“ Writer”接口的东西一起使用。 该代码无法正常工作,因为它抱怨: 方法MyWriterFunction不是表达式,必须调用 我在这里做错了什么?如何设置是? 注意:我尽了最大的努力简化了这个问题,实际上我有一个具有AND普通Write函数的结构,所以它有点复杂…(