@

目录

因看不懂 go 中的自定义函数类型,看了https://www.jianshu.com/p/431abe0d2ed5 理解了不少,特此搬运到自己博客

在看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)
ServeHTTP是HandlerFunc的一个方法(注意一下,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() 函数。

go type func() 自定义函数类型相关推荐

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

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

  2. 怎么建立软连接和删除软连接、宏定义个声明一年有多少秒、关于自定义函数类型指针

    怎么建立软连接和删除软连接 参数-f指force强制的意思 创建个/data/test/etc_ln 软连接为/etc 目录: ln -sf /etc/ /data/test/etc_ln删除软连接: ...

  3. python中func自定义函数_Python函数之自定义函数作用域闭包

    一 前言 1.1 为什么要用函数 代码的组织结构更清晰,可读性好: 遇到重复的功能不需要重新编写代码,调用函数即可,代码不会冗余: 功能需要扩展时,只需要修改函数内容即可,实现统一管理,降低代码维护难 ...

  4. C++自定义函数类型——typedef的使用

    该函数的用法需要注意的一点就是函数的返回值返回的时候,返回类型不能使用自己定义的函数名称,因为不是内置函数,所以用使用起来会报错,返回的类型需要和你定义的形参的类型相同,本文定义的Name是char* ...

  5. golang通过type定义函数类型

    函数签名 定义 函数类型 又叫 函数签名 , 一个函数 的类型就是函数定义首行去掉函数名.参数名和{,可以 使用 fmt.Printf 的"%T"格式化参数打印函数的类型. 函数类 ...

  6. go语言的type func()用法

    在go语言中,type可以定义任何自定义的类型 比如熟悉的:type dog struct{},type myInt int 等等 所以func也是可以作为类型自定义的,type myFunc fun ...

  7. 《零基础看得懂的C语言入门教程 》——(十一)C语言自定义函数真的很简单

    一.学习目标 了解C语言的自定义函数的使用方法 了解C语言自定义函数的传参 了解C语言自定义函数的返回值 目录 C语言真的很难吗?那是你没看这张图,化整为零轻松学习C语言. 第一篇:(一)脱离学习误区 ...

  8. 一文说透WordPress的自定义文章类型

    转自丘壑博客 从2004年的1.0版本算起,WordPress在14年间已经迭代开发到了5.x版.如果说这中间哪个版本是一个质的提升的话,那应该算是2010年发布的代号为Thelonious 的 3. ...

  9. 8 函数类型——《Swift3.0从入门到出家

    Swift语言中每一个函数都有它特定的数据类型,称其为函数类型 函数类型和基本数据类型一样,可以定义变量或者常量,可以定义函数形参,也可以做为函数的返回值类型 函数类型的格式为:参数列表的数据类型-& ...

最新文章

  1. 学习Vue.js-Day2
  2. MySQL复制表-INSERT INTO SELECT
  3. python 类似wordpress_python,_python 有没有类似WordPress的这种库?,python - phpStudy
  4. 万条留言!这本Python凭啥火爆程序员的朋友圈?
  5. AD下安装Exchange及简单收发邮件【视频】
  6. Trick(一)——判断一个数的位数
  7. python零基础自学教材-Python3零基础教材电子书合集
  8. PHP 根据 搜索条件/勾选数据 分批次 处理数据
  9. 浏览器无法加载本地文件
  10. Ubuntu18.04安装有道词典
  11. CF816B Karen and Coffee题解
  12. ssm框架bean_Bean简介:简化的WordPress框架
  13. win7安装ruby on rails开发环境
  14. 计算机如何安装cpu风扇,新手装电脑入门二:手把手学习如何安装CPU及散热风扇...
  15. 深入浅出对话系统——概述
  16. 硬盘无法访问设备硬件出现致命错误,导致请求失败数据找到的法子
  17. [electron]Electron安装报错connect ETIMEDOUT
  18. 法国优秀的五位数学家
  19. 新月已冉冉升起.ALOKEX永续合约统领市场已成定局
  20. 2020-MyBatis面试题

热门文章

  1. Linux(CentOS)查看系统版本
  2. python IDLE常用命令
  3. java英文段落拆分成句(Split an article into sentences)
  4. 京东大规模消息推送平台搭建实践
  5. docker入门小实验
  6. 【Java】6.8 Lambda学习
  7. 关于渗透实战中分析微信小程序前端代码的诸多问题
  8. D题:手势识别装置 -- 2018年TI杯大学生电子设计竞赛
  9. 微信公众号开发账号申请以及菜单配置。
  10. sqlite 截取字符串函数substr