go type func() 自定义函数类型
@
因看不懂 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() 自定义函数类型相关推荐
- Go语言的type func()用法 | type func() 自定义函数类型
文章目录 一.前置基础 1. go 函数基础 2. 函数签名 二.Go语言的type func()用法 | type func() 自定义函数类型 1. golang通过type定义函数类型 一.前置 ...
- 怎么建立软连接和删除软连接、宏定义个声明一年有多少秒、关于自定义函数类型指针
怎么建立软连接和删除软连接 参数-f指force强制的意思 创建个/data/test/etc_ln 软连接为/etc 目录: ln -sf /etc/ /data/test/etc_ln删除软连接: ...
- python中func自定义函数_Python函数之自定义函数作用域闭包
一 前言 1.1 为什么要用函数 代码的组织结构更清晰,可读性好: 遇到重复的功能不需要重新编写代码,调用函数即可,代码不会冗余: 功能需要扩展时,只需要修改函数内容即可,实现统一管理,降低代码维护难 ...
- C++自定义函数类型——typedef的使用
该函数的用法需要注意的一点就是函数的返回值返回的时候,返回类型不能使用自己定义的函数名称,因为不是内置函数,所以用使用起来会报错,返回的类型需要和你定义的形参的类型相同,本文定义的Name是char* ...
- golang通过type定义函数类型
函数签名 定义 函数类型 又叫 函数签名 , 一个函数 的类型就是函数定义首行去掉函数名.参数名和{,可以 使用 fmt.Printf 的"%T"格式化参数打印函数的类型. 函数类 ...
- go语言的type func()用法
在go语言中,type可以定义任何自定义的类型 比如熟悉的:type dog struct{},type myInt int 等等 所以func也是可以作为类型自定义的,type myFunc fun ...
- 《零基础看得懂的C语言入门教程 》——(十一)C语言自定义函数真的很简单
一.学习目标 了解C语言的自定义函数的使用方法 了解C语言自定义函数的传参 了解C语言自定义函数的返回值 目录 C语言真的很难吗?那是你没看这张图,化整为零轻松学习C语言. 第一篇:(一)脱离学习误区 ...
- 一文说透WordPress的自定义文章类型
转自丘壑博客 从2004年的1.0版本算起,WordPress在14年间已经迭代开发到了5.x版.如果说这中间哪个版本是一个质的提升的话,那应该算是2010年发布的代号为Thelonious 的 3. ...
- 8 函数类型——《Swift3.0从入门到出家
Swift语言中每一个函数都有它特定的数据类型,称其为函数类型 函数类型和基本数据类型一样,可以定义变量或者常量,可以定义函数形参,也可以做为函数的返回值类型 函数类型的格式为:参数列表的数据类型-& ...
最新文章
- 学习Vue.js-Day2
- MySQL复制表-INSERT INTO SELECT
- python 类似wordpress_python,_python 有没有类似WordPress的这种库?,python - phpStudy
- 万条留言!这本Python凭啥火爆程序员的朋友圈?
- AD下安装Exchange及简单收发邮件【视频】
- Trick(一)——判断一个数的位数
- python零基础自学教材-Python3零基础教材电子书合集
- PHP 根据 搜索条件/勾选数据 分批次 处理数据
- 浏览器无法加载本地文件
- Ubuntu18.04安装有道词典
- CF816B Karen and Coffee题解
- ssm框架bean_Bean简介:简化的WordPress框架
- win7安装ruby on rails开发环境
- 计算机如何安装cpu风扇,新手装电脑入门二:手把手学习如何安装CPU及散热风扇...
- 深入浅出对话系统——概述
- 硬盘无法访问设备硬件出现致命错误,导致请求失败数据找到的法子
- [electron]Electron安装报错connect ETIMEDOUT
- 法国优秀的五位数学家
- 新月已冉冉升起.ALOKEX永续合约统领市场已成定局
- 2020-MyBatis面试题