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