go语言中泛型是的是什么


今天小编给大家分享的是go语言中泛型是的是什么,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。 在go语言中,泛型就是编写模板适应所有类型,只有在具体使用时才定义具体变量类型;通过引入类型形参和类型实参的概念,让一个函数能够处理多种不同类型数据的能力,这种编程方式被称为泛型编程。Go 1.18 版本新增了一个功能:支持泛型编程。如果是其他语言转 Go 语言的开发者,那么能够理解什么是泛型,以及如何使用?但只是 Go 语言的初学者,并没有接触过泛型编程的人来说,这个功能可能一头雾水。本文希望能让为接触泛型编程的人也能很好的理解和使用 Go 的泛型

A general guideline for programming Go: write Go programs by writing code, not by defining types
Go 编程的通用准则:通过编写代码,而不是定义类型来写 Go 程序泛型就是编写模板适应所有类型,只有在具体使用时才定义具体变量类型
函数定义时的参数是形参 (parameter),在实际使用函数传入的参数为实参 (argument)假设有一个加法函数,这个函数有两个参数都是 int 类型,返回值也是 int;定义如下:

funcTest(a,bint)int{
returna+b
}

如果传入的两个实参都是 int 类型,那么函数自然能够正常执行。但是这个函数只能用来做 int 类型的加法运算,假设还需要进行 float64 类型的加法运算,我们就需要再写一个函数。【相关推荐:Go视频教程、编程教学】两三个类型加法计算写出来也不麻烦,复制粘贴而已。但是如果所有可计算类型都要进行加法运行,那么代码就会不够精简,阅读起来很不友好。这时,我们就会思考,如果一个函数能够接收所有的计算类型,这样就两三行代码写完一个计算函数了。只需要在定义函数形参时,不指定具体类型,只是定义一个类型组合或者一个占位符,就能够实现这个功能。这个类型组合或占位符就是类型参数,在定义时使用类型形参 (type parameter),实际调用时使用类型实参 (type argument)。一开始的计算函数转为类型形参函数如下:

//T是一个类型形参,在定义函数时类型是不确定的,这里的any是go泛型定义好的一组类型组合
funcTest[Tany](a,bT)T{
returna+b
}
//调用时传入类型实参,伪代码Test[int](1,2)
Test(1,2)

通过引入类型形参类型实参的概念,让一个函数能够处理多种不同类型数据的能力,这种编程方式被称为泛型编程前面的加法示例,除了使用泛型,还可以通过 Go 的接口+反射实现动态数据类型处理。泛型能实现的功能通过接口+反射也基本能够实现,但是如果你使用过反射,那么就会明白反射机制有很多问题:使用麻烦,需要有很强的逻辑思维失去编译时类型检查,容易出现 bug性能不好但也并不能说所有场景都使用泛型,泛型并不是万金油,泛型有对应的适用场景,可以阅读一下 Go 泛型设计者 Ian Lance Taylor 在官方博客网站上发表了一篇文章 when to use generics一句话总结泛型使用场景:当你分别为不同类型写逻辑完全相同的代码时,那么使用泛型是最合适的选择

//AddsumsthevaluesofT.Itsupportsstring,int,int免费云主机域名64andfloat64
//
//@DescriptionAsimpleadditivegenericfunction
//@Description一个简单的加法泛型函数
//@parameter	a,b	Tstring|int|int64|float64	"genericsparameter"
//@return		c		Tstring|int|int64|float64	"genericsreturn"
funcAdd[Tstring|int|int64|float64](a,bT)T{
	returna+b
}

//使用
Add(1,2)
Add(1.0,2.0)

//MyChanCustomgenericschantype
//一个泛型通道,可用类型实参int或string实例化
typeMyChan[Tint|string]chanT

在 Go 的类型限制是通过接口实现

//CustomizationGenericscustomgenerics
//
//@Descriptioncustomgenerics,whicharetyperestrictions
//@Description~isanewsymboladdedtoGo1.18,andthe~indicatesthattheunderlyingtypeisalltypesofT.~ispronouncedastildeinEnglish
//@Description自定义泛型,即类型限制
//@Desciption~是Go1.18新增的符号,~表示底层类型是T的所有类型。~的英文读作tilde
//
//@ExampleWiththeadditionof~,MyIntcanbeused,otherwisetherewillbetypemismatch
//@Example加上~,那么MyInt自定义的类型能够被使用,否则会类型不匹配
typeCustomizationGenericsinterface{
	~int|~int64
}

关于go语言中泛型是的是什么就分享到这里了,希望以上内容可以对大家有一定的参考价值,可以学以致用。如果喜欢本篇文章,不妨把它分享出去让更多的人看到。

相关推荐: JS怎么循环遍历json数组

本篇内容主要讲解“JS怎么循环遍历json数组”,感兴趣的朋友不妨来看看。本文介绍的方法免费云主机域名操作简单快捷,实用性强。下面就让小编来带大家学习“JS怎么循环遍历json数组”吧!例如数据库里面的json字符串是这样的上面的是js的,下面的是jquery…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 02/26 22:58
下一篇 02/26 22:59

相关推荐