首页
学习
活动
专区
工具
TVP
发布

Go 1.17 发布,说好的支持泛型又落空

2021 年 8 月 16 日,Go 团队发布 Go 1.17,您可以通过访问下载页面获得。此版本为编译器带来了额外的改进,即传递函数参数和结果的新方法。这一变化表明,Go 程序的性能提高了约 5%,amd64 平台的二进制文件大小减少了约 2%。未来版本将支持更多平台。

Go1.17 增加了 Windows/ARM64 的支持。在这个版本中引入了修剪过的模块图。在 go.mod 文件中指定 Go 1.17 或更高版本的模块,其模块图仅包含其他 Go 1.17 模块的直接依赖关系,而不包含其传递依赖关系。这有助于避免需要下载或读取 go.mod 文件,可节省日常开发的时间。

Go 1.17 发布内容

Go 1.17 对语言进行了三个小改动。

  • 从切片到数组指针的转换。类型为[]T 的表达式 s 现在可以转换为数组指针类型*[N]T 。如果 a 是这种转换的结果,那么在范围内的相应指数指的是相同的底层元素:&a[i] == &s[i]对于 0 <= i < N 。如果 len(s) 小于 N ,则转换会陷入困境。
  • unsafe.Add:unsafe.Add(ptr, len) 将 len 添加到 ptr 并返回更新的指针 unsafe.Pointer(uintptr(ptr) + uintptr(len)) 。
  • unsafe.Slice: 对于类型为*T 的表达式 ptr ,unsafe.Slice(ptr, len) 返回一个类型为[]T 的切片,其底层数组从 ptr 开始,其长度和容量为 len 。

添加这些增强功能是为了简化编写符合 unsafe.Pointer"安全规则"的代码,但这些规则保持不变。特别是,正确使用 unsafe.Pointer 的现有程序仍然有效,而新程序在使用 unsafe.Add 或 unsafe.Slice 时仍然必须遵循这些规则。

还有很多其他方面改进和错误修复,包括对 crypto/x509 的验证改进,以及对 URL 查询解析的更改 。有关更改的完整列表以及有关上述改进的更多信息,请参阅完整的发行说明

Go 泛型提案进展

Go 团队核心成员 Ian Lance Taylor 在今年年初宣布已提交为 Go 添加泛型的提案。Ian 在博客说道:“为 Go 添加泛型的语言变更完全向后兼容 (fully backward compatible),现有的 Go 程序会继续像现在一样正常运行。”

泛型草案设计概要

  • 函数可以使用带方括号的类型参数列表,类型参数列表的其他方面和普通参数列表一样: func F[T any](p T) { ... }
  • 这些类型参数可以被常规参数使用,也可以在函数体中使用
  • 类型 (Types) 也可以使用类型参数列表: type M[T any] []T
  • 每个类型参数都有一个类型约束,正如普通参数都有一个类型:func F[T Constraint](p T) { ... }
  • 类型约束属于接口类型
  • 新的预声明名称 any 是允许任何类型的类型约束
  • 用作类型约束的接口类型可以使用预声明类型的列表;只有与这些类型之一相匹配的类型参数才能满足约束条件
  • 泛型函数只能使用其类型约束所允许的操作
  • 使用泛型函数或类型需要传递类型参数
  • 在通常情况下,类型推断允许省略函数调用的类型参数

 Go 团队本来预计在 Go 1.17 中添加泛型,但很遗憾告诉大家,又要推迟了。对于推迟的泛型提案,Go Team 也在其官方博客表示,大家很期待泛型,因此他们一直在努力,为可投入使用做各种细节的打磨,2021 年这块会是重点。目标是 2021 年底,在 Go1.18 的 Beta 中让大家体验,因此不出意外泛型会在 Go1.18 实现,大家可拭目以待。

参考链接:

https://blog.golang.org/go1.17

https://blog.csdn.net/weixin_39589644/article/details/111248116

  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/zb75bZbLQAIsXIckrkNy
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券