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

为什么 http.Request 参数必须是一个指针?

为什么 http.Request 参数必须是一个指针?

Go
当年话下 2021-10-18 15:19:28
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 文字是没有意义的;我不明白为什么这是一个选择。


查看完整回答
反对 回复 2021-10-18
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

因为这就是函数的工作方式。它们有参数,当您调用它们时,您必须提供所需的参数。类型也必须相同。

我想你真的在问;为什么是这样设计的?

因为您提供了一个委托,http.HandleFunc以便在向 root 发出请求时调用"/"。在大多数情况下,当 RESTful API 处理请求时,它需要知道请求中的信息,例如标头、查询参数和/或帖子正文……如果您不想使用该信息,则不需要不必,将引用传递给函数的开销并不大。但是对于几乎每个实际用例,都需要数据,因此将其包含在内,因此在您提供的委托中将其作为参数。从他们的实现的角度来看,他们需要知道您提供的方法签名是什么,以便他们可以调用它。

因此,澄清一下,您正在查看的是func您作为http.HandleFunc. 第一个参数是路径。当对提供的路径发出 http 请求时,它会调用该方法。该代码将调用该参数调用它handler,它需要一个一致的定义,以便它可以做handler(resp, req)而不必做反射或开关或其他一些控制流来调用您的代码。


查看完整回答
反对 回复 2021-10-18
  • 2 回答
  • 0 关注
  • 301 浏览
慕课专栏
更多

添加回答

举报

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