package mainimport ( "net/http")func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request){ w.Write([]byte("hello world")) }) http.ListenAndServe(":8000", nil)}如果我删除*in http.Request:github.com/creating_web_app_go/main.go:8:不能在 http.HandleFunc 的参数中使用 func 文字(类型 func(http.ResponseWriter, http.Request))作为类型 func(http.ResponseWriter, *http.Request)我对 Go 和指针都很陌生。所以问题是,为什么必须http.Request是指针而不是 a func literal?谁能以最简单的方式解释这一点,也许可以参考源代码?
2 回答
桃花长相依
TA贡献1860条经验 获得超8个赞
因为它是一个大结构。复制它会很昂贵。所以它是一个指向结构体的指针,当结构体很大时,这在 Go 中很常见。它也有一些状态,所以如果它被复制可能会令人困惑。成为 func 文字是没有意义的;我不明白为什么这是一个选择。
蓝山帝景
TA贡献1843条经验 获得超7个赞
因为这就是函数的工作方式。它们有参数,当您调用它们时,您必须提供所需的参数。类型也必须相同。
我想你真的在问;为什么是这样设计的?
因为您提供了一个委托,http.HandleFunc
以便在向 root 发出请求时调用"/"
。在大多数情况下,当 RESTful API 处理请求时,它需要知道请求中的信息,例如标头、查询参数和/或帖子正文……如果您不想使用该信息,则不需要不必,将引用传递给函数的开销并不大。但是对于几乎每个实际用例,都需要数据,因此将其包含在内,因此在您提供的委托中将其作为参数。从他们的实现的角度来看,他们需要知道您提供的方法签名是什么,以便他们可以调用它。
因此,澄清一下,您正在查看的是func
您作为http.HandleFunc
. 第一个参数是路径。当对提供的路径发出 http 请求时,它会调用该方法。该代码将调用该参数调用它handler
,它需要一个一致的定义,以便它可以做handler(resp, req)
而不必做反射或开关或其他一些控制流来调用您的代码。
- 2 回答
- 0 关注
- 301 浏览
添加回答
举报
0/150
提交
取消