0

0

go语言中泛型是什么

青灯夜游

青灯夜游

发布时间:2022-12-09 17:57:05

|

7748人浏览过

|

来源于php中文网

原创

在go语言中,泛型就是编写模板适应所有类型,只有在具体使用时才定义具体变量类型;通过引入类型形参和类型实参的概念,让一个函数能够处理多种不同类型数据的能力,这种编程方式被称为泛型编程。

go语言中泛型是什么

本教程操作环境:windows7系统、GO 1.18版本、Dell G3电脑。

Go 1.18 版本新增了一个功能:支持泛型编程。

如果是其他语言转 Go 语言的开发者,那么能够理解什么是泛型,以及如何使用?

但只是 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;定义如下:

func Test(a,b int) int {
    return a + b
}

如果传入的两个实参都是 int 类型,那么函数自然能够正常执行。但是这个函数只能用来做 int 类型的加法运算,假设还需要进行 float64 类型的加法运算,我们就需要再写一个函数。【相关推荐:Go视频教程编程教学

两三个类型加法计算写出来也不麻烦,复制粘贴而已。但是如果所有可计算类型都要进行加法运行,那么代码就会不够精简,阅读起来很不友好。

Android配合WebService访问远程数据库 中文WORD版
Android配合WebService访问远程数据库 中文WORD版

采用HttpClient向服务器端action请求数据,当然调用服务器端方法获取数据并不止这一种。WebService也可以为我们提供所需数据,那么什么是webService呢?,它是一种基于SAOP协议的远程调用标准,通过webservice可以将不同操作系统平台,不同语言,不同技术整合到一起。 实现Android与服务器端数据交互,我们在PC机器java客户端中,需要一些库,比如XFire,Axis2,CXF等等来支持访问WebService,但是这些库并不适合我们资源有限的android手机客户端,

下载

这时,我们就会思考,如果一个函数能够接收所有的计算类型,这样就两三行代码写完一个计算函数了。只需要在定义函数形参时,不指定具体类型,只是定义一个类型组合或者一个占位符,就能够实现这个功能。

这个类型组合或占位符就是类型参数,在定义时使用类型形参 (type parameter),实际调用时使用类型实参 (type argument)。

一开始的计算函数转为类型形参函数如下:

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

通过引入类型形参类型实参的概念,让一个函数能够处理多种不同类型数据的能力,这种编程方式被称为泛型编程

为什么是泛型?

前面的加法示例,除了使用泛型,还可以通过 Go 的接口+反射实现动态数据类型处理。泛型能实现的功能通过接口+反射也基本能够实现,但是如果你使用过反射,那么就会明白反射机制有很多问题:

  • 使用麻烦,需要有很强的逻辑思维
  • 失去编译时类型检查,容易出现 bug
  • 性能不好

但也并不能说所有场景都使用泛型,泛型并不是万金油,泛型有对应的适用场景,可以阅读一下 Go 泛型设计者 Ian Lance Taylor 在官方博客网站上发表了一篇文章 when to use generics

一句话总结泛型使用场景:当你分别为不同类型写逻辑完全相同的代码时,那么使用泛型是最合适的选择

Go 泛型的示例


泛型函数

// Add sums the values of T. It supports string, int, int64 and float64
//
// @Description A simple additive generic function
// @Description 一个简单的加法泛型函数
// @parameter	a, b	T string | int | int64 | float64	"generics parameter"
// @return		c		T string | int | int64 | float64	"generics return"
func Add[T string | int | int64 | float64](a, b T) T {
	return a + b
}

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

泛型类型

// MyChan Custom generics chan type
// 一个泛型通道,可用类型实参 int 或 string 实例化
type MyChan[T int | string] chan T

声明类型限制 (type constraint)

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

// CustomizationGenerics custom generics
//
// @Description custom generics, which are type restrictions
// @Description ~is a new symbol added to Go 1.18, and the ~ indicates that the underlying type is all types of T. ~ is pronounced astilde in English
// @Description 自定义泛型,即类型限制
// @Desciption ~ 是 Go 1.18 新增的符号,~ 表示底层类型是T的所有类型。~ 的英文读作 tilde
//
// @Example With the addition of ~, MyInt can be used, otherwise there will be type mismatch
// @Example 加上 ~,那么 MyInt 自定义的类型能够被使用,否则会类型不匹配
type CustomizationGenerics interface {
	~int | ~int64
}

更多编程相关知识,请访问:编程视频!!

相关专题

更多
Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

9

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

3

2026.01.21

无人机驾驶证报考 uom民用无人机综合管理平台官网
无人机驾驶证报考 uom民用无人机综合管理平台官网

无人机驾驶证(CAAC执照)报考需年满16周岁,初中以上学历,身体健康(矫正视力1.0以上,无严重疾病),且无犯罪记录。个人需通过民航局授权的训练机构报名,经理论(法规、原理)、模拟飞行、实操(GPS/姿态模式)及地面站训练后考试合格,通常15-25天拿证。

15

2026.01.21

Python多线程合集
Python多线程合集

本专题整合了Python多线程相关教程,阅读专题下面的文章了解更多详细内容。

1

2026.01.21

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.21

windows激活码分享 windows一键激活教程指南
windows激活码分享 windows一键激活教程指南

Windows 10/11一键激活可以通过PowerShell脚本或KMS工具实现永久或长期激活。最推荐的简便方法是打开PowerShell(管理员),运行 irm https://get.activated.win | iex 脚本,按提示选择数字激活(选项1)。其他方法包括使用HEU KMS Activator工具进行智能激活。

2

2026.01.21

excel表格操作技巧大全 表格制作excel教程
excel表格操作技巧大全 表格制作excel教程

Excel表格操作的核心技巧在于 熟练使用快捷键、数据处理函数及视图工具,如Ctrl+C/V(复制粘贴)、Alt+=(自动求和)、条件格式、数据验证及数据透视表。掌握这些可大幅提升数据分析与办公效率,实现快速录入、查找、筛选和汇总。

6

2026.01.21

毒蘑菇显卡测试网站入口 毒蘑菇测试官网volumeshader_bm
毒蘑菇显卡测试网站入口 毒蘑菇测试官网volumeshader_bm

毒蘑菇VOLUMESHADER_BM测试网站网址为https://toolwa.com/vsbm/,该平台基于WebGL技术通过渲染高复杂度三维分形图形评估设备图形处理能力,用户可通过拖动彩色物体观察画面流畅度判断GPU与CPU协同性能;测试兼容多种设备,但中低端手机易卡顿或崩溃,高端机型可能因发热降频影响表现,桌面端需启用独立显卡并使用支持WebGL的主流浏览器以确保准确结果

17

2026.01.21

github中文官网入口 github中文版官网网页进入
github中文官网入口 github中文版官网网页进入

github中文官网入口https://docs.github.com/zh/get-started,GitHub 是一种基于云的平台,可在其中存储、共享并与他人一起编写代码。 通过将代码存储在GitHub 上的“存储库”中,你可以: “展示或共享”你的工作。 持续“跟踪和管理”对代码的更改。

7

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Django 教程
Django 教程

共28课时 | 3.3万人学习

Go 教程
Go 教程

共32课时 | 4万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号