在GoLand中实验Golang类型参数(泛型)

在GoLand中实验Golang类型参数(泛型) JetBrains Blog

在 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中启用泛型支持:

  1. 确保使用Go 1.18或更高版本
  2. 在GoLand设置中启用泛型实验性支持
  3. 使用go mod init初始化项目
  4. 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支持,包括错误检查、代码补全和重构功能。

回到顶部