go语言的type func()用法

go语言的type func()用法在 go 语言中 type 可以定义任何自定义的类型比如熟悉的 typedogstruc typemyIntint 等等所以 func 也是可以作为类型自定义的 typemyFuncfu int int 意思是自定义了一个叫 myFunc 的函数类型 这个函数的签名必须符合输入为 int 输出为 int 已知 相同底层类型的变量之间是可以相互转换的 例如从一个取值范围小的 int16 转为取值范围大的 int32 所以 自定义的 myInt 和 int 之间也是可以转换的 typemyIn

在go语言中,type可以定义任何自定义的类型

比如熟悉的:type dog struct{},type myInt int 等等

所以func也是可以作为类型自定义的,type myFunc func(int) int,意思是自定义了一个叫myFunc的函数类型,这个函数的签名必须符合输入为int,输出为int

已知,相同底层类型的变量之间是可以相互转换的,例如从一个取值范围小的int16转为取值范围大的int32

所以,自定义的 myInt 和 int 之间也是可以转换的

type myInt int func main() { var a int a = 2 b := myInt(a) fmt.Println(b) // 2 }

同理,myFunc 也是可以将签名为 func(int) int 的函数转换成 myFunc 类型

type myFunc func(int) int func sum10(num int) int { fmt.Println(num*10) } func main() { newFunc := myFunc(sum10) }

此时newFunc是一个变量,变量类型为myFunc,值为sum10函数!!!

那么,这个变量有什么用?

回过头来想想,自定义的类型有什么用?有什么场景需要自己定义一个myInt出来?就是重载原来的int类型,并自定义新的方法

type myInt int func (mi myInt) IsZero() bool { return mi == 0 } func main() { var a myInt a = 0 fmt.Println(a.IsZero()) // true }

同理,自定义函数类型也可以自定义方法

type myFunc func(int) int func (mf myfunc) sum(a,b int) int { c := a + b return mf(c) }

一个自定义函数类型的变量拥有了一个sum函数,有什么实际用途?

重点来了,有什么用途?

举个例子

type myFunc func(int) int func (f myFunc) sum (a, b int) int { res := a + b return f(res) } func sum10(num int) int { return num * 10 } func sum100(num int) int { return num * 100 } func handlerSum(handler myFunc, a, b int) int { res := handler.sum(a, b) fmt.Println(res) return res } func main() { newFunc1 := myFunc(sum10) newFunc2 := myFunc(sum100) handlerSum(newFunc1, 1, 1) // 20 handlerSum(newFunc2, 1, 1) // 200 }

解释下,假如handlerSum是一种特殊的sum算法,但是又有一部分的计算是可以通过外部自定义函数来干预的,那么使用这种方式就很合适

再进一步,如何使得handlerSum函数更抽象化?我必须传递一个myFunc类型的变量参数进来吗?参数是一个interface呢,一个拥有sum方法的interface是不是更通用?

type sumable interface { sum(int, int) int } // myFunc继承sumable接口 type myFunc func(int) int func (f myFunc) sum (a, b int) int { res := a + b return f(res) } func sum10(num int) int { return num * 10 } func sum100(num int) int { return num * 100 } // icansum结构体继承sumable接口 type icansum struct { name string res int } func (ics *icansum) sum(a, b int) int { ics.res = a + b return ics.res } // handler只要是继承了sumable接口的任何变量都行,我只需要你提供sum函数就好 func handlerSum(handler sumable, a, b int) int { res := handler.sum(a, b) fmt.Println(res) return res } func main() { newFunc1 := myFunc(sum10) newFunc2 := myFunc(sum100) handlerSum(newFunc1, 1, 1) // 20 handlerSum(newFunc2, 1, 1) // 200 ics := &icansum{"I can sum", 0} handlerSum(ics, 1, 1) // 2 }

这样handlerSum接受的是一个只要实现了sum接口的变量就可以了,可以是一个struct变量,也可以是一个自定义函数类型变量,只要变量继承实现了sum函数即可,这样就可以更自由的干预(自定义)handlerSum函数需要的执行过程了

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233955.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • PLSQL详细使用教程及下载地址「建议收藏」

    PLSQL详细使用教程及下载地址「建议收藏」Oracle数据库连接必备,大公司玩转oracle数据库必备,虽然现在已经都用MYSQL替换了,但是不可否认这款软件的实力。中文版还具有语法加强、SQL和PL/SQL帮助、对象描述等功能特性。下载地址:http://kk04.cn/f-6339.html详细使用教程:http://kk04.cn/f-6342.html…

    2022年5月2日
    50
  • 队列的顺序存储结构之循环队列

    队列的顺序存储结构之循环队列一、队列的定义队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出(FirstInFirstOut)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。如图所示:二、循环队列的引出为了避免当队中只剩一个元素的时候,队头队尾重合使处理变得麻烦。所以我们引入两个指针,front指针指向队头元素,rear指针指向队尾元素…

    2022年5月22日
    40
  • 三大主流芯片架构特点是_zachman架构

    三大主流芯片架构特点是_zachman架构根据以往互联网时代的经验,芯片永远都是产业链最上游的存在,是行业先导指标。众所周知,目前芯片领域有两大霸主,分别是Intel和Arm,Intel掌握着X86的架构,并且只授权给AMD一家公司,其他厂商都无法生产X86架构的芯片,而Intel与微软的windows系统结盟,称霸台式机市场并且牢不可破。Arm在移动领域是一家独大,不管是高通、三星或是华为、联发科都是基于Arm的架构开发。MIPS是一个…

    2022年9月7日
    3
  • js中find的用法_js中find函数

    js中find的用法_js中find函数首先简单的介绍一下ES6是什么,可能很多人还是第一次听说,我们都知道H5是html的新一代的标准,同样,ES6是javascript的新一代标准,全称是ECMAScript6.0,简称ES6,其实不是什么神秘的东西。15年6月发布的。今天我们要说的是结合ES6新特性谈一下js里面的一个很好用的方法-find()现在的前端和过去的不一样,过去的前端只要会画页面就行了,但是现在仅仅会画页面已…

    2022年10月14日
    2
  • 服务器一般指什么_怎么把电脑做成服务器

    服务器一般指什么_怎么把电脑做成服务器同事问我PCserver是什么意思找到1篇文章给他解释下服务器定义从广义上讲,服务器是指网络中能对其它机器提供某些服务的计算机系统(如果一个PC对外提供ftp服务,也可以叫服务器)。从狭义上讲,

    2022年8月3日
    5
  • 搜索优化_百度搜索关键词

    搜索优化_百度搜索关键词一个网站其实很简单,但难的是在于那些搜索引擎如(google,yahoo,msn等)如何找到你,并提高排名!最近,我总结了7条最新、最重要的注意事项1.网站优化是为了访问者,而不是针对搜索引擎。  这一点是做网站的终极目标,请牢记这一点。搜索引擎优化要考虑用户体验,用户体验这个东西最重要的了,我们做站就是为了客户所以用户体验是非常重要是第一位的。其次在用户体验的基础之上很好地进行搜

    2025年7月29日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号