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

Pointers 为什么http.Request参数必须是指针?,pointers,go,Pointers,Go,如果我删除http.Request中的*: github.com/creating_web_app_go/main.go:8:无法将func literal(类型func(http.ResponseWriter,http.Request))用作http.HandleFunc的参数中的类型func(http.ResponseWriter,*http.Request) 我对围棋和指针都是新手 所以问题是,, 为什么http.Request必须是指针而不是func-literal?有人能用最简单的方式

如果我删除
http.Request
中的
*

github.com/creating_web_app_go/main.go:8:无法将func literal(类型func(http.ResponseWriter,http.Request))用作http.HandleFunc的参数中的类型func(http.ResponseWriter,*http.Request)

我对围棋和指针都是新手

所以问题是,,
为什么
http.Request
必须是指针而不是
func-literal
?有人能用最简单的方式解释这一点吗?也许可以参考源代码?

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

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

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

因为您为
http.HandleFunc
提供了一个委托,以便在向根
“/”
发出请求时调用。在大多数情况下,当RESTful API处理请求时,它需要知道请求中的信息,比如头、查询参数和/或post正文。。。如果您不想使用不必使用的信息,那么将引用传递到函数中不会有太多开销。但对于几乎每一个实际的用例,数据都是必需的,所以它被包含在内,所以它在您提供的委托中成为一个参数。从实现的过程来看,他们需要知道您提供的方法签名是什么,这样他们才能调用它


因此,为了澄清,您正在查看的是作为http.HandleFunc的第二个参数提供的
func
所需的签名。第一个参数是路径。当对提供的路径发出http请求时,它调用该方法。该代码将调用该参数调用它
handler
,它需要一个一致的定义,这样它就可以执行
handler(resp,req)
,而不必执行反射、切换或其他控制流来调用代码。

为什么-1?这真的是一个问得不好的问题吗?事实上这是一个非常好的问题。是的,func文本只是当你不将它设置为指针时它抛出的错误。这其中有很多有趣的地方,我将不得不深入研究,即委派、反射、控制流lol,但我认为这是最正确的答案。谢谢你的努力!马修哈伍德:记住,我的描述相当抽象。代码本身就是这样做的;如果您想查看
HandleFunc
func(w http.ResponseWriter,r*http.Request)
参数的实际作用。另外,请注意,您通常可以在其他地方使用该sig定义函数并按名称传递它。
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)
}