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)
}
作为 golang 初学者,不能理解"r *http.Request "为什么不需要实际参数,r 是存储在哪里的。 "w http.ResponseWriter"也不需要实际参数吗。这从语法上怎么理解?
1
liuxey 2018-12-11 13:23:51 +08:00
实际参数不是 r 吗?我觉得楼主基础知识有点缺,看不懂你的问题
|
2
wsseo OP @liuxey 我也觉得。我理解的是 r 是形式参数,函数不是一般需要传递实际参数吗?像这样调用的时候传递实参 func_b(r)
|
3
xlui 2018-12-11 13:40:14 +08:00 via iPhone
@wsseo 就跟 Java EE 中 servlet 的参数一样,实参是容器在调用处理方法时传进去的。具体到这个例子,匿名函数的实参是在请求 / 时 http 包内部在回调匿名函数时传进去的,实际应用中我们不需要关心。个人理解。
|
4
liuxey 2018-12-11 13:45:16 +08:00 1
@wsseo #2 我大概懂你问的意思了,这些概念好久远
http.HandleFunc 的形式参数有两个,pattern 和 handler,handler 是一个 func,签名就是 func(ResponseWriter, *Request),那么你代码里写的: func(w http.ResponseWriter, r *http.Request){ w.Write([]byte("hello world")) } 就是 handler 的实际参数,它的类型是 func,这里只是将这个 func 注册到默认的 defaultServeMux 中,具体传递实参是在运行中接受请求时调用的,不是通过 http.HandleFunc 调用,如果你开发过函数式类型的语言的话,这里应该很好理解。 你可以花个一天时间看下 Golang http 的实现,源码很简单的(如何你想彻底搞懂 http 模块的话) |
5
AzadCypress 2018-12-11 13:49:12 +08:00
func main() {
http.HandleFunc("/", func_b) http.ListenAndServe(":8000", nil) } func func_b(w http.ResponseWriter, r *http.Request){ w.Write([]byte("hello world")) } 写成这样应该能看明白,参数哪里来的你得去看 http.HandleFunc 的实现 |
7
tiedan 2018-12-11 17:49:04 +08:00
参数在 HandleFunc 里面传进去的啊
|