Go语言 接口型函数

从net/http聊起

使用net/http构建简单的http服务时候,我们经常是调用http.HandleFunc。但是还有http.Handle函数。看看其是如何使用的。

// 只写函数
func myFunc(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte(r.URL.Path))
}

// 需要写结构体
type httpServer struct {
}

func (server httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte(r.URL.Path))
}

func main() {
	//http.HandlerFunc(myFunc)不是调用函数,而是进行类型强制转换
	http.Handle("/func", http.HandlerFunc(myFunc))

	var server httpServer
	http.Handle("/handler", server)

	http.HandleFunc("/HandleFunc", myFunc)

	http.ListenAndServe("localhost:10000", nil)
}

http.Handle函数原型是func Handle(pattern string, handler Handler)

这里会不会很好奇http.Handle的第二个参数,可以传入函数,也可以传入结构体变量

接口型函数

查看net/http源码:

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

//函数类型
type HandlerFunc func(ResponseWriter, *Request)

// ServeHTTP calls f(w, r).
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
	f(w, r)
}

Handler是个接口,只包含一个方法ServeHTTP(ResponseWriter, *Request),接着定义了一个函数类型 HandlerFuncHandlerFunc参数和返回值与 Handler中的ServeHTTP方法是一致的。

而且 HandlerFunc还定义了ServeHTTP方式,并在 ServeHTTP方法中调用自己,这样就实现了接口 Handler。

所以 HandlerFunc是一个实现了接口的函数类型,简称为接口型函数

从HandlerFunc类型中可知,函数myFunc的参数和返回值都与HandlerFunc是一致的,所以可以进行类型强制转换。

用接口型函数的好处

从前面的例子来说,使用接口型函数可以减少代码量,可读性也不错。

  • 使用接口型函数入参的话,只需要写一个函数即可(也可使用匿名函数);
  • 而使用结构体的话,就需要声明新的类型(如结构体httpServer),接着再实现该接口内的方法(ServeHTTP)。使用时候就还需要创建出该结构体变量,把该结构体变量传入。

总结

接口型函数就是该函数类型实现了这个接口。(例子参考net/http的HandlerFunc)

函数类型实现了接口,那函数参数是接口的时候,既能够将普通的函数类型(需类型转换)作为参数,也可以将结构体作为参数,使用更为灵活,可读性也更好,这就是接口型函数的价值。

相关推荐

  1. Go语言 口型函数

    2023-12-10 09:52:05       42 阅读
  2. Go 语言函数

    2023-12-10 09:52:05       51 阅读
  3. Go 语言函数

    2023-12-10 09:52:05       9 阅读
  4. Go语言函数

    2023-12-10 09:52:05       10 阅读
  5. go语言学习--2.函数

    2023-12-10 09:52:05       14 阅读
  6. Go语言入门:Go语言的方法,函数,接口】

    2023-12-10 09:52:05       33 阅读
  7. go语言利用反射实现reverse函数

    2023-12-10 09:52:05       33 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-10 09:52:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-10 09:52:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-10 09:52:05       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-10 09:52:05       20 阅读

热门阅读

  1. 如何在Go中编写包

    2023-12-10 09:52:05       45 阅读
  2. go与ioc

    2023-12-10 09:52:05       33 阅读
  3. 深入学习之anaconda、pytorch、cuda安装

    2023-12-10 09:52:05       39 阅读
  4. 开启 winrm 功能

    2023-12-10 09:52:05       35 阅读
  5. VSCode 创建工作区,多文件夹终端切换

    2023-12-10 09:52:05       34 阅读
  6. Python排序指南

    2023-12-10 09:52:05       35 阅读
  7. Vue笔记(五)路由进阶

    2023-12-10 09:52:05       38 阅读
  8. python制作贪吃蛇游戏

    2023-12-10 09:52:05       37 阅读
  9. TimescaleDB-1 安装

    2023-12-10 09:52:05       52 阅读
  10. 力扣1004题 最大连续1的个数 III 滑动窗口

    2023-12-10 09:52:05       33 阅读
  11. Doris Hive外表

    2023-12-10 09:52:05       37 阅读