写点什么

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

作者:Barry Yan
  • 2022-11-22
    北京
  • 本文字数:1317 字

    阅读完需:约 4 分钟

一文搞懂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
用户头像

Barry Yan

关注

做兴趣使然的Hero 2021-01-14 加入

Just do it.

评论

发布
暂无评论
一文搞懂Go1.18泛型新特性_Go_Barry Yan_InfoQ写作社区