Golang必备技巧:接口型函数

亮子_a8be · · 1625 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

接口型函数,指的是用函数实现接口,这样在调用的时候就会非常简便,我称这种函数,为接口型函数,这种方式使用于只有一个函数的接口

对于只有一个方法的接口,每次都要实现这个接口,过于繁琐,所以通常通过接口型函数,来达到简化的目的,直接上代码

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


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:亮子_a8be

查看原文:Golang必备技巧:接口型函数

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1625 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传