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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql15激活码【2021.10最新】「建议收藏」

    (mysql15激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月27日
    70
  • Android audio_audiomack安卓版下载

    Android audio_audiomack安卓版下载音频基础知识声音有哪些重要属性呢?响度(Loudness)响度就是人类可以感知到的各种声音的大小,也就是音量。响度与声波的振幅有直接关系。音调(Pitch)音调与声音的频率有关系,当声音的频率越大时,人耳所感知到的音调就越高,否则就越低。音色(Quality)同一种乐器,使用不同的材质来制作,所表现出来的音色效果是不一样的,这是由物体本身的结构特性所决定的。

    2025年8月28日
    5
  • uuid生成唯一数字_java组件有哪些

    uuid生成唯一数字_java组件有哪些UUID含义是通用唯一识别码(UniversallyUniqueIdentifier),这是一个软件建构的标准,也是被开源软件基金会(OpenSoftwareFoundation,OSF)的组织在分布式计算环境(DistributedComputingEnvironment,DCE)领域的一部份。UUID的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需

    2022年9月22日
    4
  • ubuntu常见问题指南 新手发问前必看 08/03/27 更新

    ubuntu常见问题指南 新手发问前必看 08/03/27 更新

    2021年8月7日
    64
  • 紫橙绿蓝的jQuery幻灯片切换

    效果展示 http://hovertree.com/texiao/jquery/77/看惯了左右切换的幻灯片,何问起向您推荐一个新颖的,旋转切换,通过点击按钮的相应区域可以使幻灯片以旋转的方

    2021年12月27日
    41
  • c++ 常量表达式_c语言所有函数

    c++ 常量表达式_c语言所有函数constexpr修饰函数。普通函数/类成员函数。1.函数必须要有返回值,并且return返回的表达式必须是常量表达式。错误代码如下:#include<iostream>usingnamespacestd;//error不是常量表达式函数constexprvoidfunc1(){ inta=200; cout<<a<<endl;}//error不是常量表达式函数因为a是变量,不是常量constexprint

    2022年9月27日
    2

发表回复

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

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