在看golang 的http服务部分代码时,被golang 中的 type func()写法难住了,一时没看懂代码。后来查资料后,有了一点理解。
在golang中可以通过这样简单实现一个http服务

package mainimport "net/http"func mHttp() {http.HandleFunc("/", h)http.ListenAndServe("0.0.0.0:8888",nil)
}
func h(w http.ResponseWriter, r *http.Request) {}

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

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

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

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

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

type HandlerFunc func(ResponseWriter, *Request)func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {f(w, r)
}

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

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

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

package mainimport "fmt"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)
}

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

我们在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() 用法分析相关推荐

  1. Go语言的type func()用法 | type func() 自定义函数类型

    文章目录 一.前置基础 1. go 函数基础 2. 函数签名 二.Go语言的type func()用法 | type func() 自定义函数类型 1. golang通过type定义函数类型 一.前置 ...

  2. php的filter input,php中filter_input函数用法分析

    本文实例分析了php中filter_input函数用法.分享给大家供大家参考.具体分析如下: 在 php5.2 中,内置了filter 模块,用于变量的验证和过滤,过滤变量等操作,这里我们看下如何直接 ...

  3. php_os用法,golang中os包用法

    os包中实现了平台无关的接口,设计向Unix风格,但是错误处理是go风格,当os包使用时,如果失败之后返回错误类型而不是错误数量. os包中函数设计方式和Unix类似,下面来看一下. func Chd ...

  4. golang 中io包用法(一)

    本文转自Golove博客:http://www.cnblogs.com/golove/p/3276678.html   ,并在此基础上进行修改. io 包为I/O原语提供了基础的接口.它主要包装了这些 ...

  5. python os.path.splitext()的用法_Python中os.path用法分析

    本文实例分析了Python中os.path用法.分享给大家供大家参考.具体如下: #coding=utf-8 import os print os.path.abspath("d:\\new ...

  6. php explode用法,php中explode函数用法分析

    本文实例分析了php中explode函数用法.分享给大家供大家参考.具体如下: explode(string separator,string string [,int limit]) separat ...

  7. C#中yield return用法分析

    转载地址:https://www.jb51.net/article/54810.htm 这篇文章主要介绍了C#中yield return用法,对比使用yield return与不使用yield ret ...

  8. php中 param,php中bind_param()函数用法分析

    本文实例讲述了php中bind_param()函数用法.分享给大家供大家参考,具体如下: 从字面上不难理解,绑定的参数:下面我通过一个绑定参数的例子讲一下: for example: bind_par ...

  9. python中exp函数_Python3中exp()函数用法分析

    python中虚数函数exp怎么表示 复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b)表示, 复数的实部a和虚部b都是浮点型 虚数函数exp用math是不行的要用cmat ...

最新文章

  1. 数据库 ' 库名' 已打开,并且一次只能有一个用户访问。 (Microsoft SQL Server,错误: 924)
  2. ISA Server 2006排错最佳实践
  3. 遇到automation服务器不能创建对象...
  4. Linux驱动编程 step-by-step (六) 用户地址检测 简单模块调试 以及一些杂项
  5. 剑指offer 从上往下打印二叉树
  6. asp.net mvc中DropDownList,CheckBox,RadioButton
  7. 误删/usr/bin/python2.7解决方案
  8. opencv图像拼接_使用OpenCV进行图像全景拼接
  9. nyoj 309 bobsledding 即河南省第四届大学生程序设计大赛第七题
  10. 有关PyCharm的破解安装
  11. matlab图像放大程序,图像放大并进行BiCubic插值 Matlab/C++代码
  12. 【趣味实践】自动补帧算法——RIFE的使用
  13. 书到用时方恨少,绝知此事要躬行--谈TCP/UDP编程
  14. Dynamical Isometry and a Mean Field Theory of CNNs
  15. 还在用网盘备份同步3D图纸?你落伍了
  16. Macbooster8免费mac清理垃圾软件功能介绍
  17. 小白入门知识图谱构建与应用
  18. NTFS Change Journal(USN Journal)详解
  19. 江苏移动_网上营业厅_登录网址
  20. 根据汉字获取它的字符串拼音首字母(大写),含多音字

热门文章

  1. Pure Css简单小结
  2. 如何通过DeFi工具网站寻找神矿
  3. Human-level concept learning through probabilistic program induction
  4. C#中ref、out类型参数的区别和params类型参数的用法
  5. 机器学习——简单歌曲分类
  6. css text 大小统一样式,css-iPhone上的字体大小呈现不一致
  7. mysql timestampdiff datediff_MySql中 DATEDIFF 函数 和 TIMESTAMPDIFF 时间 函数
  8. Python 列表查找,如何在列表中查找项目或者元素索引【翻译】
  9. 利用计算机求出200的算术平方根,6.1用计算机计算算术平方根.ppt
  10. C++ vector 内存释放