GO 1.18 泛型的简单尝试

admin 2022年3月18日00:39:51评论153 views字数 1372阅读4分34秒阅读模式


GO 1.18 泛型的简单尝试
GO 1.18 泛型的简单尝试

今天golang终于发布了1.18版本,这个版本最大的一个改变就是加入了泛型。虽然没有在beta版本的时候尝试泛型,但是由于在其他语言的泛型经验,入手泛型不是件难事~




GO 1.18 泛型的简单尝试

官方示例


Tutorial: Getting started with generics - The Go Programming Language

根据官方示例可以看出,在go中泛型声明使用中括号,大体用法也与其他语言差不多。下面就官方示例中出现的几个点做记录。



GO 1.18 泛型的简单尝试

comparable


在泛型的约束中有 comparable 关键字,我们进到源码中看到解释:

// comparable is an interface that is implemented by all comparable types
// (booleans, numbers, strings, pointers, channels, arrays of comparable types,
// structs whose fields are all comparable types).
// The comparable interface may only be used as a type parameter constraint,
// not as the type of a variable.
type comparable interface{ comparable }

看得出来这是官方定义的一个可比较的类型的一个泛型约束,它也只能存在于类型参数约束的时候。



GO 1.18 泛型的简单尝试

一些改变


我们尝试修改官方示例,体验一下其他的关键词及相关用法。

~ 波浪号

我们会在一些泛型示例中看到这样的声明:

type Number interface {
 ~int64 | float64 | string
}

~ 在这里应该可以理解为 泛类型 ,即所有以 int64 为基础类型的类型都能够被约束。

我们来举个例子:现在我们声明一个以 int64 为基础类型,取名为testInt

type testInt int64

type Number interface {
 ~int64
}

func SumIntsOrFloats[K comparable, V Number](m map[K]V) V {
 var s V
 for _, v := range m {
  s += v
 }
 return s
}

func main() {
 ints := map[string]testInt{
  "first":  34,
  "second": 12,
 }

 fmt.Printf("Generic Sums: %vn",
  SumIntsOrFloats(ints))
}

在这个示例中,可以看到我们将testInt作为自定义类型传入了泛型方法中,在这种情况下,如果不给Number中的int64加~,这里就会报错。加上~之后代表以int64为基本类型的自定义类型也可以通过泛型约束



GO 1.18 泛型的简单尝试

未发布的内容


在泛型的测试阶段,有一个 constraints 包被加入到源码中,这个包里面声明了一些官方定义的约束,但是在正式的发布版中却被去掉了。


想要了解更多与 Go 语言相关的内容,添加微信号:gocnio, 让小编拉你入群哦~欢迎入群和我们进行交流~


GO 1.18 泛型的简单尝试

原文始发于微信公众号(GoCN):GO 1.18 泛型的简单尝试

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年3月18日00:39:51
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   GO 1.18 泛型的简单尝试https://cn-sec.com/archives/831518.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息