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)
上一篇 2025年6月8日 下午3:01
下一篇 2025年6月8日 下午3:22


相关推荐

  • JavaScript数组filter方法

    JavaScript数组filter方法1.数组filter方法作用筛选数组,将满足条件的元素放入新数组中2.语法:array.filter(function(item,index,arr){})第一个参数:item,必须,当前元素的值第二个参数:index,可选,当前元素在数组中的索引值第三个参数:arr,当前元素所处的数组对象3.filter方法特点(1)函数执行次数===数组长度(2)函数内部的returnreturntrue:满足筛选条件,放入新数组中return

    2022年7月14日
    18
  • JS 字符串转Date类型

    JS 字符串转Date类型字符串转日期时间格式 getDate strDate vardate eval newDate strDate replace d function a returnparseI a 10 1 match d g returndate

    2026年3月19日
    1
  • 理解group by[通俗易懂]

    理解group by[通俗易懂]先来看下表1,表名为test: 表1  执行如下SQL语句: 1 2 SELECT name FROM test GROUP BY name   你应该很容易知道运行的结果,没错,就是下表2: 表2  可是为了能够更好的理解“groupby”多个列“和”聚合函数“的应用,我建议在思考的过程中,由表1到表2的过程中…

    2022年5月26日
    34
  • 思科(Cisco)路由器常用命令总结

    思科(Cisco)路由器常用命令总结思科 Cisco 路由器常用命令总结思科路由器常用命令总结 1 路由器口令设置 router gt enable 进入特权模式 router configtermin 进入全局配置模式 router config hostname 设置交换机的主机名 router config enablesecret 设置特权加密口令 router config enablepas

    2026年3月18日
    1
  • java sortedset_Java集合 TreeSet和SortedSet

    java sortedset_Java集合 TreeSet和SortedSet一 TreeSetTreeS 是集合的一种 与 HashSet 不同的是他是有序的 也就是说 TreeSet 中的数据是有序不重复的 TreeSet 实现了 SortedSet 这个接口 由于 TreeSet 是 SortedSet 的一个子类 因此 TreeSet 具有 SortedSet 的所公共方法 具体案例详情见 SortedSet 二 SortedSetSor 是一个有序的接口 集合内元素有 2 种排序

    2026年3月26日
    3
  • 测试用例八大要素有哪些?

    测试用例八大要素有哪些?测试用例八大要素:用例编号、操作步骤、测试标题、重要级别、前置条件、测试输入、所属模块、预期结果。用例编号由字符串组成,具有易于识别性和唯一性;操作步骤需要标明详细的测试步骤;测试标题需要简洁、明了;重要级别一般分为高、中、低;前置条件就是进行测试用例的前提条件;测试输入包括用户名、密码、订单号等内容;所属模块标明被测试的模块或者单元;预期结果表示预期输出的结果。测试用例很重要,是设计和测试过程的基础,同时测试用例也是软件测试的核心,可以发现软件可能出现的bug,一般每个软件产品都有与之对应的测试用

    2022年6月28日
    101

发表回复

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

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