在GoLand中实验Golang类型参数(泛型)
在 GoLand 中尝试 Go 类型参数(泛型) – GoLand 博客 |…
在今天的文章中,我们将在 Go 中尝试泛型及其最新形式——类型参数。 在开始之前,我们先快速了解一下该提案的历史。 Go 中泛型的历史 泛型…
不过,有一个名为 go2go 的工具可以执行转换。 🙂
更多关于在GoLand中实验Golang类型参数(泛型)的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于在GoLand中实验Golang类型参数(泛型)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
// 使用Go 1.18+的泛型示例
package main
import "fmt"
// 泛型函数示例
func PrintSlice[T any](s []T) {
for _, v := range s {
fmt.Print(v, " ")
}
fmt.Println()
}
// 泛型结构体示例
type Stack[T any] struct {
items []T
}
func (s *Stack[T]) Push(item T) {
s.items = append(s.items, item)
}
func (s *Stack[T]) Pop() T {
if len(s.items) == 0 {
var zero T
return zero
}
item := s.items[len(s.items)-1]
s.items = s.items[:len(s.items)-1]
return item
}
// 泛型接口约束示例
type Number interface {
int | float64
}
func Sum[T Number](numbers []T) T {
var total T
for _, n := range numbers {
total += n
}
return total
}
func main() {
// 测试泛型函数
intSlice := []int{1, 2, 3, 4, 5}
PrintSlice(intSlice)
stringSlice := []string{"a", "b", "c"}
PrintSlice(stringSlice)
// 测试泛型结构体
stack := Stack[int]{}
stack.Push(10)
stack.Push(20)
fmt.Println(stack.Pop()) // 20
// 测试带约束的泛型函数
fmt.Println(Sum([]int{1, 2, 3})) // 6
fmt.Println(Sum([]float64{1.1, 2.2})) // 3.3
}
在GoLand中启用泛型支持:
- 确保使用Go 1.18或更高版本
- 在GoLand设置中启用泛型实验性支持
- 使用
go mod init初始化项目 - 在
go.mod中添加go 1.18或更高版本
GoLand的泛型特性支持:
- 类型参数代码补全
- 泛型函数和类型的正确高亮
- 泛型代码的导航和查找引用
- 重构操作支持泛型代码
// 更复杂的泛型示例
type Pair[T, U any] struct {
First T
Second U
}
func MapKeys[K comparable, V any](m map[K]V) []K {
keys := make([]K, 0, len(m))
for k := range m {
keys = append(keys, k)
}
return keys
}
// 类型集约束示例
type Ordered interface {
~int | ~float64 | ~string
}
func Max[T Ordered](a, b T) T {
if a > b {
return a
}
return b
}
GoLand会自动识别泛型语法并提供完整的IDE支持,包括错误检查、代码补全和重构功能。


