当前位置:网站首页>go泛型使用方法
go泛型使用方法
2022-08-03 09:18:00 【m0_67394230】
golang泛型使用方法
1. 泛型是什么
泛型生命周期只在编译期,旨在为程序员生成代码,减少重复代码的编写
在比较两个数的大小时,没有泛型的时候,仅仅只是传入类型不一样,我们就要再写一份一模一样的函数,如果有了泛型就可以减少这类代码
// int
func GetMaxNumInt(a, b int) int {
if a > b {
return a
}return b
}
// int8
func GetMaxNumInt8(a, b int8) int8 {
if a > b {
return a
}return b
}
2. 泛型的简单使用
2.1. 泛型示例
需要go版本大于等于1.18
我们先改造一下上面的示例,只需要在函数后用
中括号
声明T可能出现的类型,中间用符号"|"
分隔// 使用泛型
func GetMaxNum[T int | int8](a, b T) T {
if a > b {
return a
}return b
}
2.2. 自定义泛型类型
如果类型太多了怎么办呢?这时候我们就可以自定义泛型类型
// 像声明接口一样声明
type MyInt interface {
int | int8 | int16 | int32 | int64
}// T的类型为声明的MyInt
func GetMaxNum[T MyInt](a, b T) T {
if a > b {
return a
}return b
}
2.3. 调用带泛型的函数
如何调用这个带有泛型的函数呢?
var a int = 10
var b int = 20// 方法1,正常调用,编译器会自动推断出传入类型是int
GetMaxNum(a, b)// 方法2,显式告诉函数传入的类型是int
GetMaxNum[int](a, b)
3. 自定义泛型类型的语法
在2.2小节中我们可以看到一个泛型的简单自定义类型,本节将会详细描述泛型自定义类型的语法
3.1. 内置的泛型类型any和comparable
- any: 表示go里面所有的内置基本类型,等价于
interface{}
- comparable: 表示go里面所有内置的可比较类型:
int、uint、float、bool、struct、指针
等一切可以比较的类型
3.2. 声明一个自定义类型
跟声明接口一样,使用
type x interface{}
关键字来声明,不过里面的成员不再是方法,而是类型,类型之间用符号"|"
隔开type MyInt interface {
int | int8 | int16 | int32 | int64
}成员类型支持go中所有的基本类型
type MyT interface {
int | float32 | bool | chan int | map[int]int | [10]int | []int | struct{} | *http.Client
}
3.3. 泛型中的"~"符号是什么
符号
"~"
都是与类型一起出现的,用来表示支持该类型的衍生类型// int8的衍生类型
type int8A int8
type int8B = int8// 不仅支持int8, 还支持int8的衍生类型int8A和int8B
type MyInt interface {
~int8
}
4. 泛型的进阶使用
4.1. 泛型与结构体
创建一个带有泛型的结构体
User
,提供两个获取age
和name
的方法注意:
只有在结构体上声明了泛型,结构体方法中才可以使用泛型type AgeT interface {
int8 | int16
}type NameE interface {
string
}type User[T AgeT, E NameE] struct {
age T
name E
}// 获取age
func (u *User[T, E]) GetAge() T {
return u.age
}// 获取name
func (u *User[T, E]) GetName() E {
return u.name
}我们可以通过声明结构体对象时,声明泛型的类型来使用带有泛型的结构体
// 声明要使用的泛型的类型
var u User[int8, string]// 赋值
u.age = 18
u.name = “weiwei”// 调用方法
age := u.GetAge()
name := u.GetName()// 输出结果 18 weiwei
fmt.Println(age, name)
5. 泛型的限制或缺陷
5.1 无法直接和switch配合使用
将泛型和
switch
配合使用时,无法通过编译func GetT any T {
var t Tswitch T { case int: t = 18 } return t
}
只能先将泛型赋值给
interface
才可以和switch
配合使用func GetT any T {
var t Tvar ti interface{} = &t switch v := ti.(type) { case *int: *v = 18 } return t
}
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
- 【字节面试】word2vector输出多少个类别
- 【LeetCode】622. Design Circular Queue
- 面试突击71:GET 和 POST 有什么区别?
- LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之二:编码实现
- NFT到底有哪些实际用途?
- Scala parallel collections, parallel concurrency, thread safety issues, ThreadLocal
- MySQL-DDL数据定义语言-约束
- STP生成树选举结果查看及验证
- WinCheck Script
- MySQL_关于JSON数据的查询
猜你喜欢
Index (3)
Path Prefixes (倍增!树上の二分)
MySQL1
dflow部署简记
flutter 应用 抓包
110道 MySQL面试题及答案 (持续更新)
浅析什么是伪类和伪元素?伪类和伪元素的区别解析
chrome F12 network 保留之前请求信息
Rabbit and Falcon are all covered, Go lang1.18 introductory and refined tutorial, from Bai Ding to Hongru, the whole platform (Sublime 4) Go lang development environment to build EP00
多媒体数据处理实验1:算术编码
随机推荐
MySQL-TCL语言-transaction control language事务控制语言
Unity编辑器扩展批量修改图片名称
合并两个有序链表
What exactly does a firmware engineer do?
LINGO 18.0 software installation package download and installation tutorial
bihash总结
系统io统计
【LeetCode】101. Symmetric Binary Tree
多媒体数据处理实验3:图像特征提取与检索
响应式布局经典范例——巨幅背景大标题
mysql数据库配置性能调优
mysql的union和union all
关于Unity自定义Inspector面板的一些自定义编辑器扩展
别人都不知道的“好用”网站,让你的效率飞快
判断根节点是否等于子节点之和
AUC的两种计算方式
【LeetCode】622.设计循环队列
兔起鹘落全端涵盖,Go lang1.18入门精炼教程,由白丁入鸿儒,全平台(Sublime 4)Go lang开发环境搭建EP00
验证浮点数输入
【LeetCode】226. Flip the binary tree