geektutu / blog

极客兔兔的博客,Coding Coding 创建有趣的开源项目。

Home Page:https://geektutu.com

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Go 接口型函数的使用场景 | 极客兔兔

geektutu opened this issue · comments

https://geektutu.com/post/7days-golang-q1.html

Go 语言/golang 中函数式接口或接口型函数的实现与价值,什么是接口型函数,为什么不直接将函数作为参数,而是封装为一个接口。Go 语言标准库 net/http 中是如何使用接口型函数的。

今天看Gee框架的第一章,自己写的时候就发现这个奇怪的玩意儿了。刚好好奇点进来这个附录,没想到就看到大佬的解析!关于应用以及好处,讲得有理有据!

还是没能理解接口

commented

这块想了很久,其实学过java的要理解很简单。
java最早是不支持给接口参数里传函数的,其实1.8之后就是对函数式接口做了些处理,使得可以直接穿匿名函数/lambda表达式。
golang也是为了向接口参数里传函数,所以取了个巧,让函数继承了接口,从而接口型函数可以接受(转换自)匿名函数,从而名正言顺地往接口里传函数,否则其实是类型不匹配的。

方式一是表现出接口型函数的实际使用情况。方式二讲的是接口使用上的便捷情景,其实和接口型函数无关。一开始看无脑代入标题,硬是都往接口型函数用法上凑,反而懵逼了。

最近看书刚好看到这个写法,一开始不太理解这样子写的作用,觉得很繁琐,后面想到java8中的函数式接口

其实就是方便直接传入函数作为参数

非常像 typescript 里的函数接口声明

interface Getter {
  get(key: string): [byte: string[], error: Error]
}

interface GetterFunc extends Getter {
  (key: string): [byte: string[], error: Error]
}

// 实现
const getterFunc: GetterFunc = (key: string) => {
  return [[key], new Error('error')]
}
getterFunc.get = (key: string) => getterFunc(key)


function getFromSource(getter: Getter, key: string): string[] {
  const [byte, error] = getter.get(key)
  if (error) {
    throw error
  }
  return byte
}
commented

@squallsyttt
方式一是表现出接口型函数的实际使用情况。方式二讲的是接口使用上的便捷情景,其实和接口型函数无关。一开始看无脑代入标题,硬是都往接口型函数用法上凑,反而懵逼了。

我也想说,方式二跟接口型函数没关系啊,哪里体现出了接口型函数的便捷性了?

commented

讲的好好诶,学习了

面向接口编程