http://events.jianshu.io/p/3ff594bb87de
https://www.zhihu.com/question/318138275/answer/2127814257
Go语言的泛型(Generic)叫做类型参数。泛型可以让我们代码适应不同类型的参数
/*
声明一个带有泛型的函数
T 指类型参数,就是一个参数,代表类型
Constraint 是对类型参数T的约束,限制T的取值, 可以是int、string、any等类型,any可以是任意类型的意思
s 是要打印的参数
*/
func name[T {Constraint}](s T) {}
函数名和函数参数列表之间插入了一组方括号,来表示类型参数。
跟函数参数一样,我们需要为每一个类型参数指定「类型」,这种类型的类型Go语言称之为约束。
1. Constrained Generic Type
package main
import (
"fmt"
)
type Stringer = interface {
String() string
}
type Integer int
func (i Integer) String() string {
return fmt.Sprintf("%d", i)
}
type String string
func (s String) String() string {
return string(s)
}
type Student struct {
Name string
ID int
Age float64
}
func (s Student) String() string {
return fmt.Sprintf("%s %d %0.2f", s.Name, s.ID, s.Age)
}
func addStudent[T Stringer](students []T, student T) []T {
return append(students, student)
}
func main() {
students := []String{}
result := addStudent[String](students, "Michael")
result = addStudent[String](result, "Jennifer")
result = addStudent[String](result, "Elaine")
fmt.Println(result)
students1 := []Integer{}
result1 := addStudent[Integer](students1, 45)
result1 = addStudent[Integer](result1, 64)
result1 = addStudent[Integer](result1, 78)
fmt.Println(result1)
students2 := []Student{}
result2 := addStudent[Student](students2, Student{"John", 213, 17.5})
result2 = addStudent[Student](result2, Student{"James", 111, 18.75})
result2 = addStudent[Student](result2, Student{"Marsha", 110, 16.25})
fmt.Println(result2)
}
2. Constrained Generic Type
package main
import (
"fmt"
)
type Student struct {
Name string
ID int
Age float64
}
func addStudent[T any](students []T, student T) []T {
return append(students, student)
}
func main() {
students := []string{}
result := addStudent[string](students, "Michael")
result = addStudent[string](result, "Jennifer")
result = addStudent[string](result, "Elaine")
fmt.Println(result)
students1 := []int{}
result1 := addStudent[int](students1, 45)
result1 = addStudent[int](result1, 64)
result1 = addStudent[int](result1, 78)
fmt.Println(result1)
students2 := []Student{}
result2 := addStudent[Student](students2, Student{"John", 213, 17.5})
result2 = addStudent[Student](result2, Student{"James", 111, 18.75})
result2 = addStudent[Student](result2, Student{"Marsha", 110, 16.25})
fmt.Println(result2)
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
2016-12-21 grub的sol
2016-12-21 netstat
2015-12-21 网络设备模拟器 GNS3