golang中 type func() 用法

在看golang 的http服务部分代码时,被golang 中的 type func()写法难住了,一时没看懂代码。后来查资料后,有了一点理解。

在golang中可以通过这样简单实现一个http服务

 1package main
 2
 3import "net/http"
 4
 5func mHttp() {
 6	http.HandleFunc("/", h)
 7	http.ListenAndServe("0.0.0.0:8888",nil)
 8}
 9func h(w http.ResponseWriter, r *http.Request) {
10
11}

http.HandleFunc()是一个注册函数,传一个string类型的路由,和一个函数,函数的参数为(http.ResponseWriter, *http.Request)。跟踪进入函数,在golang 源码net/http/server.go文件中

1func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
2	DefaultServeMux.HandleFunc(pattern, handler)
3}

HandleFunc调用了 DefaultServeMux.HandleFunc(pattern, handler) 至于这些函数是干啥的先不做探讨,这不是本文的重点。 再次跟进函数

1func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
2	if handler == nil {
3		panic("http: nil handler")
4	}
5	mux.Handle(pattern, HandlerFunc(handler))
6}

mux.Handle(pattern, HandlerFunc(handler)) 的第二个参数HandlerFunc(handler)是什么鬼。 跟进看一下

1type HandlerFunc func(ResponseWriter, *Request)
2
3func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
4	f(w, r)
5}

原来HandlerFunc 是用 type 定义的函数,而函数的类型就是最开始传入的类型func(ResponseWriter, *Request) ServeHTTPHandlerFunc的一个方法(注意一下,golang中方法和函数不是一回事)。并且HandlerFunc实现了 Handler接口 Handler接口定义:

1type Handler interface {
2	ServeHTTP(ResponseWriter, *Request)
3}

回到HandleFunc方法中,mux.Handle(pattern, HandlerFunc(handler))的第二个参数是把传入的函数 handler 强转成 HandlerFunc类型,这样handler就实现了Handler接口。 到这我们明白HandlerFunc(handler) 是把普通函数强转成type定义的函数。 现在写一个简单的demo验证一下:

 1package main
 2
 3import "fmt"
 4
 5func main() {
 6	one(2, callback)
 7}
 8
 9//需要传递函数
10func callback(i int) {
11	fmt.Println("i am callBack")
12	fmt.Println(i)
13}
14
15//main中调用的函数
16func one(i int, f func(int)) {
17	two(i, fun(f))
18}
19
20//one()中调用的函数
21func two(i int, c Call) {
22	c.call(i)
23}
24
25//定义的type函数
26type fun func(int)
27
28//fun实现的Call接口的call()函数
29func (f fun) call(i int) {
30	f(i)
31}
32
33//接口
34type Call interface {
35	call(int)
36}

先看一下程序的运行结果:

我们在 main() 函数中调用了 one() 函数,并传入了 callback() 函数,最终调用了我们传入的 callback() 函数。

理一下思路:

使用 type 定义函数 func(int) 定义 Call 接口,Call中有一个函数 call(int)main() 中调用 one(2, callback),在 one() 中调用 two(),传入two() 函数前,对callback函数实现了类型转换,从普通函数转换成type定义的函数。 在 two() 中调用传入的 c 因为 c 实现了 Call 接口,所以可以调用 call() 函数,最终调用了我们传入的 callback() 函数。

关于golang中 type func() 用法先分析到这吧,有不同的见解,欢迎评论区探讨
发表了56篇文章 · 总计128.44k字
本博客已稳定运行
© QX
使用 Hugo 构建
主题 StackJimmy 设计