Go 1.27 互动教程
Go 1.27 即将发布,因此现在是了解新特性的好时机。官方发布说明相当干枯,所以这里有一个带可运行示例的实操版本,展示了发生了什么变化以及新行为是如何工作的。首先简单感谢一下:互动 Go 教程是由 Anton Zhiyanov 开始的,他为每个版本(从 Go 1.22 到 Go 1.26)编写了教程。他决定停下来了,所以我们将接着他的工作继续进行。他早期的教程都值得一读:Go 1.22 互动教程、Go 1.23 互动教程、Go 1.24 互动教程、Go 1.25 互动教程、Go 1.26 互动教程。谢谢你,Anton。在我们开始挖掘新特性之前,让我们先设定一下背景。本文是基于官方发布说明和 Go 源代码编写的,源代码采用 BSD-3-Clause 许可证。这不是一个详尽的列表;有关详细信息,请参见官方发布说明。链接指向每个特性的文档(𝗗)、提案(𝗣)、最相关的提交(𝗖𝗟)以及作者(𝗔);查看它们以获取动机、使用和实现细节。作者(𝗔)是指对该特性有贡献的人(编写实现、测试,或者对于从早期实验中毕业的特性,编写原始设计的人),不一定是单一的主要作者。为了保持示例简短,错误处理通常被略过。生产环境中请勿这样做。 通用方法 # 这是版本的标题。现在方法声明可以声明自己的类型参数,而不依赖于接收者的类型。在 Go 1.27 之前,只有顶层函数可以是通用的,因此对某种类型的通用操作必须作为包级函数,而不是方法。假设我们有一个通用容器,并希望有一个可以更改元素类型的 Map 操作: ```go type Box [ T any ] struct { v T } ``` // 该方法声明自己的类型参数 U(Go 1.27 新增)。 ```go func ( b Box [ T ]) Map [ U any ]( f func ( T ) U ) Box [ U ] { return Box [ U ]{ v : f ( b . v )} } ``` 现在 Map 是 Box 的一个方法,可以将一个 int 类型的箱子转换为一个 string 类型的箱子: ```go func main () { b := Box [ int ]{ v : 21 } doubled := b . Map ( func ( n int ) int { return n * 2 }) label := doubled . Map ( func ( n int ) string { return fmt . Sprintf (
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡