geektutu / blog

极客兔兔的博客,Coding Coding 创建有趣的开源项目。
https://geektutu.com
Apache License 2.0
166 stars 21 forks source link

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

Open geektutu opened 3 years ago

geektutu commented 3 years ago

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

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

spiritbird commented 2 years ago

Jeffrey0628 commented 2 years ago

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

c-jf commented 2 years ago

还是没能理解接口

xumu1 commented 2 years ago

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

squallsyttt commented 2 years ago

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

linxin1995 commented 2 years ago

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

taka250 commented 2 years ago

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

981377660LMT commented 2 years ago

非常像 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
}
yy4ever commented 1 year ago

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

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

Hypersus commented 1 year ago

讲的好好诶,学习了

KingSolvewer commented 1 year ago

面向接口编程

KingSolvewer commented 1 year ago

是的,只要实现了这个接口的任何类型(除了interface类型以外)都可以作为参数传递给函数使用

祧轩辕世胄少武礽泰 @.***

 

------------------ 原始邮件 ------------------ 发件人: "geektutu/blog" @.>; 发送时间: 2023年2月19日(星期天) 中午12:25 @.>; @.**@.>; 主题: Re: [geektutu/blog] Go 接口型函数的使用场景 | 极客兔兔 (#102)

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

一下子理解了

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.***>