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

package main


import (

    "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?谁能以最简单的方式解释这一点,也许可以参考源代码?


当年话下
浏览 302回答 2
2回答

桃花长相依

因为它是一个大结构。复制它会很昂贵。所以它是一个指向结构体的指针,当结构体很大时,这在 Go 中很常见。它也有一些状态,所以如果它被复制可能会令人困惑。成为 func 文字是没有意义的;我不明白为什么这是一个选择。

蓝山帝景

因为这就是函数的工作方式。它们有参数,当您调用它们时,您必须提供所需的参数。类型也必须相同。我想你真的在问;为什么是这样设计的?因为您提供了一个委托,http.HandleFunc以便在向 root 发出请求时调用"/"。在大多数情况下,当 RESTful API 处理请求时,它需要知道请求中的信息,例如标头、查询参数和/或帖子正文……如果您不想使用该信息,则不需要不必,将引用传递给函数的开销并不大。但是对于几乎每个实际用例,都需要数据,因此将其包含在内,因此在您提供的委托中将其作为参数。从他们的实现的角度来看,他们需要知道您提供的方法签名是什么,以便他们可以调用它。因此,澄清一下,您正在查看的是func您作为http.HandleFunc. 第一个参数是路径。当对提供的路径发出 http 请求时,它会调用该方法。该代码将调用该参数调用它handler,它需要一个一致的定义,以便它可以做handler(resp, req)而不必做反射或开关或其他一些控制流来调用您的代码。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go