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

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

关于Go1.18版本的发布,当然不只有泛型(Generics)这一个新特性,具体的发布文档可以看下Go官方博客:go.dev/blog/go1.18…

1 安装Go1.18和环境

下载地址:

go.dev/dl/go1.18.3…

go.dev/dl/go1.18.3…

go.dev/dl/go1.18.3…

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泛型编程更加严谨,泛型最多的就是在集合中,能使得集合的变量类型统一,并且有统一的抽象方法,保证代码的质量和可读性。

今天的文章就到这里咯~


相关文章
|
1月前
|
IDE Go 开发工具
一文搞懂Go1.18泛型新特性
一文搞懂Go1.18泛型新特性
43 0
|
1月前
|
存储 缓存 安全
Go 简单设计和实现可扩展、高性能的泛型本地缓存
本文将会探讨如何极简设计并实现一个可扩展、高性能的本地缓存。支持多样化的缓存策略,例如 最近最少使用(LRU)等。
80 0
Go 简单设计和实现可扩展、高性能的泛型本地缓存
|
1月前
|
安全 Go
Go语言并发新特性:单向通道的读写控制
Go语言并发新特性:单向通道的读写控制
52 0
|
19天前
|
算法 物联网 编译器
Go 1.23 新特性前瞻
【6月更文挑战第9天】Go 1.23 预计将引入更灵活的错误处理、性能优化、语法改进和标准库增强。可能包括编译器优化、新的网络特性,以及对现有函数的扩展。虽然具体细节待官方发布,但这些更新将进一步提升 Go 语言的效率和适用性,吸引开发者并改善编程体验。关注官方消息以掌握最新特性,助力项目开发。
|
8天前
|
编译器 Go 开发者
Go语言进阶篇——泛型
Go语言进阶篇——泛型
|
30天前
|
Java 编译器 Go
【字节跳动青训营】后端笔记整理-1 | Go语言入门指南:基础语法和常用特性解析(一)
本文主要梳理自第六届字节跳动青训营(后端组)-Go语言原理与实践第一节(王克纯老师主讲)。
48 1
|
10天前
|
缓存 编译器 Go
什么是go中的泛型
Go 语言在1.18版引入了泛型,旨在简化代码并提高复用性。泛型通过类型参数允许编写通用函数,如一个`Add`函数可以处理整数和浮点数的加法,减少了为不同类型编写重复代码的需求。类型约束(如`int`或`float64`)定义了类型参数适用的范围。编译器自动进行类型推导,简化调用。泛型可用于结构体(如创建泛型缓存)和其他场景,当逻辑相同但涉及不同类型时,可考虑使用泛型。注意泛型在处理自定义类型时,返回值可能是底层类型而非自定义类型,需通过类型约束来保持一致性。
|
30天前
|
存储 JSON Java
【字节跳动青训营】后端笔记整理-1 | Go语言入门指南:基础语法和常用特性解析(三)
在 Go 语言里,符合语言习惯的做法是使用一个单独的返回值来传递错误信息。
32 0
|
30天前
|
存储 Go C++
【字节跳动青训营】后端笔记整理-1 | Go语言入门指南:基础语法和常用特性解析(二)
Go 语言中的复合数据类型包括数组、切片(slice)、映射(map)和结构体(struct)。
46 0
|
1月前
|
算法 Java Go
【Go语言专栏】Go语言中的泛型编程探索
【4月更文挑战第30天】Go语言新引入的泛型编程支持使得代码更通用灵活。通过类型参数在函数和接口定义中实现泛型,如示例中的泛型函数`Swap`和泛型接口`Comparator`。泛型应用包括数据结构、算法实现、函数包装和错误处理,提升代码复用与维护性。这一特性扩展了Go语言在云计算、微服务、区块链等领域的应用潜力。