接口型函数,指的是用函数实现接口,这样在调用的时候就会非常简便,我称这种函数,为接口型函数,这种方式使用于只有一个函数的接口。
对于只有一个方法的接口,每次都要实现这个接口,过于繁琐,所以通常通过接口型函数,来达到简化的目的,直接上代码
package main
import (
"fmt"
)
type Handler interface {
Do(k, v interface{})
}
func Each(m map[interface{}]interface{}, h Handler) {
if m != nil && len(m) > 0 {
for k, v := range m {
h.Do(k, v)
}
}
}
//第一种
type welcom string
func (w welcom) Do(k, v interface{}) {
fmt.Printf("通用接口实现,实现自我介绍:我叫%s,今年%d岁\n", k, v)
}
//第二种
type HandlerFunc func(k, v interface{})
func (h HandlerFunc) Do(k, v interface{}) {
h(k, v)
}
func EachFunc(m map[interface{}]interface{}, f func(k, v interface{})) {
Each(m, HandlerFunc(f)) // 将f 强制转换成HandlerFunc,此例子中将myself转为HandlerFunc
}
//配合第二种
func myself(k, v interface{}) {
fmt.Printf("通过接口型函数实现自我介绍:我叫%s,今年%d岁\n", k, v)
}
func main() {
//第一种 实现接口Handler
persons := make(map[interface{}]interface{})
persons["张三"] = 20
persons["李四"] = 23
persons["王五"] = 26
Each(persons, welcom(""))
// 通过函数来实现
fmt.Println("++++++++++")
//第二种 通过接口型函数实现
EachFunc(persons, myself)
}
代码分析:
1.定义个Handler接口,只包含一个方法Do(k,v),用于遍历map时,调用
2.第一种方法就是普遍用的,通过实现接口的方式,很简单,但是很啰嗦,每一个调用者都需要去实现Handler接口,而且还必须是Do(k,v)方法,
3.通过接口型函数简化:
第一步:定义一个新的类型HandlerFunc,它是一个func(k, v interface{})类型,然后这个新的HandlerFunc实现了Handler接口,Do方法的实现是调用HandlerFunc本身,因为HandlerFunc类型的变量就是一个方法。
第二步:通过EachFunc(),帮助调用者强制转型,EachFunc函数接收的是一个func(k, v interface{})类型的函数,没有必要实现Handler接口了
https://www.flysnow.org/2016/12/30/golang-function-interface.html
有疑问加站长微信联系(非本文作者)