func main() {
http.HandleFunc("/", Handler)
http.ListenAndServe("127.0.0.0:8000", nil)
}
func Handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "hello world")
}
这是一个简单的http请求的demo
func HandleFunc(pattern string, handler func(ResponseWriter, *Request))
hander函数: 具有func(w http.ResponseWriter, r *http.Requests)签名的函数
handler处理器(函数): 经过HandlerFunc结构包装的handler函数,它实现了ServeHTTP接口方法的函数。调用handler处理器的ServeHTTP方法时,即调用handler函数本身。
handler对象:实现了Handler接口ServeHTTP方法的结构。
handler处理器和handler对象的差别在于,一个是函数,另外一个是结构,它们都有实现了ServeHTTP方法。很多情况下它们的功能类似,下文就使用统称为handler。这算是Golang通过接口实现的类动态类型吧。
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
所有的handler搜实现了serveHTTP接口的方法
接下来分析一下:
func main() {
one(2, callback)
}
//需要传递函数
func callback(i int) {
fmt.Println("i am callBack")
fmt.Println(i)
}
//main中调用的函数
func one(i int, f func(int)) {
two(i, fun(f))
}
//one()中调用的函数
func two(i int, c Call) {
c.call(i)
}
//定义的type函数
type fun func(int)
//fun实现的Call接口的call()函数
func (f fun)call(i int) {
f(i)
}
//接口
type Call interface {
call(int)
}
最后callback实现了call(int)方法
同理:在http中所有的handler搜实现了serveHTTP接口的方法