一文搞懂Go1.18泛型新特性

简介: 一文搞懂Go1.18泛型新特性

关于Go1.18版本的发布,当然不只有泛型(Generics)这一个新特性,具体的发布文档可以看下Go官方博客:https://go.dev/blog/go1.18,可以看出除了泛型,还增加了工作区、模糊测试等新特性,但是泛型这一特性无疑是最引人瞩目的,再贴一下泛型学习的官方文档:https://go.dev/doc/tutorial/generics,接下来就跟随官方文档还有此篇博客,一起来搞懂Go1.18新特性—泛型!

1 安装Go1.18和环境

下载地址:

https://go.dev/dl/go1.18.3.windows-amd64.msi

https://go.dev/dl/go1.18.3.darwin-amd64.pkg

https://go.dev/dl/go1.18.3.linux-amd64.tar.gz

IDE的话目前GoLand2022.1版本以上才支持泛型编程,VSCode、Vim也可以,但是个人比较喜欢使用GoLand

2 Go泛型编程实例

2.1 泛型容器

泛型List

type MyList[T any] struct {
   Items []Item[T]
}
type Item[T any] struct {
   Index int
   Value T
}
func (list *MyList[T]) AddItem(i T) {
   item := Item[T]{Value: i, Index: len(list.Items)}
   list.Items = append(list.Items, item)
}
func (list *MyList[T]) GetItem(index int) T {
   l := list.Items
   var val T
   for i := range l {
      if l[i].Index == index {
         val = l[i].Value
      }
   }
   return val
}
func (list *MyList[T]) Print() {
   for i := range list.Items {
      fmt.Println(list.Items[i])
   }
}

泛型Map

type MyHashMap[K comparable, V any] struct {
   Value map[K]V
}
func (m *MyHashMap[K, V]) SetValue(k K, v V) {
   m.Value[k] = v
}
func (m *MyHashMap[K, V]) GetValue(k K) V {
   return m.Value[k]
}
func (m *MyHashMap[K, V]) Print() {
   for k := range m.Value {
      fmt.Println(k, m.Value[k])
   }
}

使用:

func main() {
   list := MyList[int]{}
   list.AddItem(1)
   list.AddItem(2)
   fmt.Println(list)
   item := list.GetItem(7)
   fmt.Println(item)
   list.Print()
   hashMap := MyHashMap[string, int]{map[string]int{"A": 1, "B": 2}}
   hashMap.SetValue("s", 2)
   fmt.Println(hashMap)
   value := hashMap.GetValue("s")
   fmt.Println(value)
   hashMap.Print()
}

PS:

  • comparable:The comparable interface may only be used as a type parameter constraint, not as the type of a variable.(Comparable是由所有可比类型实现的接口 ,Comparable接口只能用作类型参数约束,而不能用作变量的类型。 )
  • any:any is an alias for interface{} and is equivalent to interface{} in all ways.(Any是interface{}的别名,在所有方面等价于interface{}。 )
2.2 泛型类型

泛型类型和方法:

type Score interface {
   int64|float64 //限制类型
}
func GetNum[T Score](n1, n2 T) T {
   return n1 + n2
}

使用:

func main() {
   num := GetNum[64](12.123,2)
   fmt.Println(num)
}

3 小结

由上边的示例可以看出,Go泛型的语法相对还是比较复杂的,但是正因为这些复杂,才能显得Go泛型编程更加严谨,泛型最多的就是在集合中,能使得集合的变量类型统一,并且有统一的抽象方法,保证代码的质量和可读性。

今天的文章就到这里咯~

相关文章
|
4月前
|
分布式计算 安全 Java
简单易懂的 Go 泛型使用和实现原理介绍
简单易懂的 Go 泛型使用和实现原理介绍
|
1月前
|
并行计算 安全 Go
Go语言的并发特性
【10月更文挑战第26天】Go语言的并发特性
18 1
|
2月前
|
安全 Java Go
Go语言的其他特性
【10月更文挑战第10天】Go语言的其他特性
|
3月前
|
安全 Go C语言
Go常量的定义和使用const,const特性“隐式重复前一个表达式”,以及iota枚举常量的使用
这篇文章介绍了Go语言中使用`const`定义常量的方法,包括常量的特性“隐式重复前一个表达式”,以及如何使用`iota`实现枚举常量的功能。
|
4月前
|
安全 Java Go
Java&Go泛型对比
总的来说,Java和Go在泛型的实现和使用上各有特点,Java的泛型更注重于类型安全和兼容性,而Go的泛型在保持类型安全的同时,提供了更灵活的类型参数和类型集的概念,同时避免了运行时的性能开销。开发者在使用时可以根据自己的需求和语言特性来选择使用哪种语言的泛型特性。
57 7
|
4月前
|
Prometheus Cloud Native Go
Go 1.22 标准库 slices 新增函数和一些旧函数增加新特性
Go 1.22 标准库 slices 新增函数和一些旧函数增加新特性
|
4月前
|
Go
Go 1.21的新特性: 切片和映射
Go 1.21的新特性: 切片和映射
|
4月前
|
安全 编译器 Go
Go 1.21: 泛型函数的全面回顾
Go 1.21: 泛型函数的全面回顾
|
4月前
|
Go
Go1.22 新特性:for 循环不再共享循环变量,且支持整数范围
Go1.22 新特性:for 循环不再共享循环变量,且支持整数范围
|
5月前
|
安全 算法 程序员
在go语言中使用泛型和反射
【7月更文挑战第8天】本文介绍go支持泛型后,提升了代码复用,如操作切片、映射、通道的函数,以及自定义数据结构。 泛型适用于通用数据结构和函数,减少接口使用和类型断言。
133 1
在go语言中使用泛型和反射