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)
}
如果我删除 http.Request
中的 *
:
github.com/creating_web_app_go/main.go:8: cannot use func literal (type func(http.ResponseWriter, http.Request)) as type func(http.ResponseWriter, *http.Request) in argument to http.HandleFunc
我对 Go 和指针都很陌生。
所以问题是,
为什么 http.Request
必须是指针而不是 func literal
?谁能以最简单的方式解释这一点,也许可以引用源代码?
最佳答案
因为它是一个大结构。复制它会很昂贵。所以它是一个指向结构的指针,当结构很大时,这在 Go 中很常见。它也有一些状态,所以如果它被复制可能会造成混淆。成为 func 文字是没有意义的;我不明白为什么这是一个选项。
关于pointers - 为什么 http.Request 参数必须是一个指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31145564/