-
Go泛型简介
Go语言的泛型是在Go 1.18版本中引入的一个新特性,它允许开发者编写可以处理不同数据类型的代码,而无需为每种数据类型都编写重复的代码。以下是关于Go语言泛型的一些关键点:
- 泛型是通过在函数或类型定义中使用类型参数来实现的。类型参数可以被看作是一个特殊的类型,它可以在函数或类型定义中的任何位置使用。
-
在函数或类型定义中,类型参数的列表是在名称后面的方括号中给出的。例如,在函数定义
func PrintSlice[T any](s []T) {...}
中,T
是一个类型参数,any
是它的约束。 -
约束定义了类型参数可以接受的类型范围。例如,
any
约束允许类型参数接受任何类型,包括内置类型、接口类型、结构体类型等。 - 你可以定义自己的约束,通过定义一个接口类型,然后在类型参数列表中使用它。类型参数必须满足这个接口的所有方法。
- Go语言的泛型是在编译时实现的,这意味着所有的类型检查都是在编译时进行的,而不是在运行时。
- Go语言的泛型提供了代码复用和类型安全的优点,但是它也可能导致编译时间增加和生成的二进制文件变大。
以下是一些使用Go语言泛型的示例:
1. 泛型函数
接受一个类型参数T
,并返回T
类型的切片中的第一个元素。
|
package main |
|
|
|
import "fmt" |
|
|
|
func First[T any](s []T) (T, bool) { |
|
if len(s) == 0 { |
|
var zero T |
|
return zero, false |
|
} |
|
return s[0], true |
|
} |
|
|
|
func main() { |
|
fmt.Println(First[int]([]int{1, 2, 3})) |
|
fmt.Println(First[string]([]string{"Hello", "World"})) |
|
} |
2. 泛型类型
定义了一个可以存储任何类型元素的栈。
|
package main |
|
|
|
import "fmt" |
|
|
|
type Stack[T any] []T |
|
|
|
func (s *Stack[T]) Push(v T) { |
|
*s = append(*s, v) |
|
} |
|
|
|
func (s *Stack[T]) Pop() (T, bool) { |
|
if len(*s) == 0 { |
|
var zero T |
|
return zero, false |
|
} |
|
index := len(*s) - 1 |
|
element := (*s)[index] |
|
*s = (*s)[:index] |
|
return element, true |
|
} |
|
|
|
func main() { |
|
s := Stack[int]{} |
|
s.Push(1) |
|
s.Push(2) |
|
s.Push(3) |
|
fmt.Println(s.Pop()) |
|
fmt.Println(s.Pop()) |
|
fmt.Println(s.Pop()) |
|
} |
3. 自定义约束
定义了一个函数,该函数接受一个实现了Stringer
接口的类型参数。
|
package main |
|
|
|
import ( |
|
"fmt" |
|
"strconv" |
|
) |
|
|
|
type Stringer interface { |
|
String() string |
|
} |
|
|
|
func Print[T Stringer](s T) { |
|
fmt.Println(s.String()) |
|
} |
|
|
|
type MyInt int |
|
|
|
func (m MyInt) String() string { |
|
return strconv.Itoa(int(m)) |
|
} |
|
|
|
func main() { |
|
Print[MyInt](MyInt(10)) |
|
} |
在这个例子中,Print
函数接受一个实现了Stringer
接口的类型参数。MyInt
类型实现了Stringer
接口,所以我们可以将MyInt
类型的值传递给Print
函数。
声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
author: mengbin
blog: mengbin
github: https://mengbin92.github.io/
cnblogs: 恋水无意
出处:https://www.cnblogs.com/lianshuiwuyi/p/17617023.html
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式