加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Golang泛型函数

发布时间:2020-12-16 18:38:27 所属栏目:大数据 来源:网络整理
导读:目前,golang还不支持模板函数(类型参数化),所以看上去不得不为每一种类型都实现一个函数。但是Golang可以利用空接口interface{}和闭包/高阶函数来实现泛型函数。 1 空接口 空接口interface{}是指方法集为空的接口,任何类型的值都可以赋值给空接口。接口

目前,golang还不支持模板函数(类型参数化),所以看上去不得不为每一种类型都实现一个函数。但是Golang可以利用空接口interface{}和闭包/高阶函数来实现泛型函数。


1 空接口

空接口interface{}是指方法集为空的接口,任何类型的值都可以赋值给空接口。接口相关内容请参见另一篇博客《Golang中的接口》

//interface{}
funcminimum(firstinterface{},rest...interface{})interface{}{
minimum:=first
for_,x:=rangerest{
switchx:=x.(type){
caseint:
ifx<minimum.(int){
minimum=x
}
casefloat64:
ifx<minimum.(float64){
minimum=float64(x)
}
casestring:
ifx<minimum.(string){
minimum=string(x)
}
}
}

returnminimum
}

funcmain(){
i:=minimum(4,5,1,9,-1,-5,7)
fmt.Println(i)

j:=minimum(4.5,5.2,-0.4,9.9,2.1)
fmt.Println(j)

k:=minimum("abc","def","xyz","ctz","{}","#$%^&*","中国")
fmt.Println(k)
}

运行结果

wKiom1YfXduSBg53AABgUzDIuAI217.jpg


2 闭包/高阶函数

所谓闭包就是一个函数“捕获”了和它在同一作用于的其他常量和变量,从形式上看匿名函数都是闭包。闭包相关内容请参见另一篇博客《golang闭包》

//closure
funcfilter(limitint,predicatefunc(int)bool,appenderfunc(int)){
fori:=0;i<limit;i++{
ifpredicate(i){
appender(i)
}
}
}


funcmain(){
a:=[]int{4,-3,-8,2,1}
even:=[]int{}
filter(len(a),func(iint)bool{returna[i]%2==0},func(iint){even=append(even,a[i])})
fmt.Println(even)
}

运行结果

wKiom1YfXn7xm5n6AABSp99p2RQ239.jpg


上述两个例子非常巧妙的实现了泛型功能,可见golang“难以置信的灵活和强大

不过,至于golang为何不实现类似C++的模板我还不太理解,在实践中慢慢感悟吧。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读