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

Mat*_*ood 2 pointers go

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)
}
Run Code Online (Sandbox Code Playgroud)

如果我删除*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是指针而不是func literal?任何人都可以用最简单的方式解释这一点,也许可以参考源代码?

Rob*_*ier 10

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