Go 1.23新特性前瞻

2024年5月22日,Go 1.23版本[1]功能特性正式冻结,后续将只改bug,不增加新feature。

437f174e7c9e362a6f6a5869bd5dbc6a.png

对Go团队来说,这意味着开始了Go 1.23rc1的冲刺,对我们普通Gopher而言,这意味着是时候对Go 1.23新增的功能做一些前瞻了

在Go没有发布Go 1.23rc1之前,我们至少可以通过以下两种渠道体验Go 1.23的最新特性:

  • 通过go install安装tip版本;

  • 使用Go playground[2]在线体验。

注:关于Go tip的安装方法以及Go playground在线体验的详细说明,这里就不赘述了,《Go语言第一课》[3]专栏的“03|配好环境:选择一种最适合你的Go安装方法[4]”有系统全面的讲解,欢迎订阅阅读。

按照Go Release cycle[5],Go 1.23将于2024年8月发布!因此目前为时尚早,下面列出的有些变化最终不一定能进入到Go 1.23的最终版本中,有小概率被revert的可能或者推迟到下一个版本(Go 1.24),所以切记一切变更点要以最终Go 1.23版本发布时为准。

1. 语言变化

Go 1.23语言变化较少,除了range over func试验特性转正,再有就是几个悬而未决的spec变更。

1.1 range over func试验特性转正(61405[6])

Go 1.22版本[7]引入了range over func[8]试验特性,通过GOEXPERIMENT=rangefunc,可以实现函数迭代器。这一特性在Go 1.23版本正式转正,下面代码可以直接使用Go 1.23编译运行:

// go1.23-foresight/lang/range-over-function-iterator/main.go

package main

import "fmt"

func Backward[E any](s []E "E any") func(func(int, E) bool) {
 return func(yield func(int, E) bool) {
  for i := len(s) - 1; i >= 0; i-- {
   if !yield(i, s[i]) {
    return
   }
  }
  return
 }
}

func main() {
 sl := []string{"hello", "world", "golang"}
 for i, s := range Backward(sl) {
  fmt.Printf("%d : %s\n", i, s)
 }
}

使用Go 1.23运行上述示例:

$go run main.go                     
2 : golang
1 : world
0 : hello

range over func可以提供一种统一、高效的迭代方式, 为泛型后的自定义容器类提供统一的迭代接口,同时也可以替代部分现有API返回切片的做法, 改为通过迭代器的形式改进性能(通过编译器的优化),甚至还可以为函数式编程风格提供标准迭代机制。

rang over func机制的实现是通过编译器在源码层面的转换,其转换形式大致如下:

// 单循环变量
for x := range f1 {
 ...
}

将被转换为:

f1(func(x T) bool {
 ...
})

而另外一种常见的双循环变量形式的for range:

for expr1, expr2 = range f2 {
 ...
}

将被转换为:

f2(func(#p1 T1, #p2 T2) bool {
 expr1, expr2 = #p1, #p2
 ...
})

前提是:f1和f2分别要满足标准库中iter包中的下面函数原型形式:

// $GOROOT/src/iter/iter.go
type Seq[V any] func(yield func(V) bool) bool
type Seq2[K, V any] func(yield func(K, V) bool) bool

此外,for range循环体中如果有break,将被转换为f1/f2中的return false,而如果有continue,则会被转换为return true。当然这只是大致的形式,实际的转换远比这个要复杂很多,要考虑的情况也是十分复杂。更为具体、复杂的转换可以参考Go编译器的实现源码rewrite.go[9]

函数迭代器虽然转正,但肯定尚未成熟,后

### 安装 Golang 1.23 版本于 Linux 系统 对于希望在Linux系统上安装Golang 1.23版本的情况,可以遵循一系列特定指令来完成这一目标。 #### 下载 Go 语言二进制文件 为了获取适合Linux系统的Go语言包,应当访问官方资源并利用`wget`命令下载对应的压缩包。尽管提供的示例指向了一个较旧的版本链接,当前应替换为目标版本号以匹配最新的需求: ```bash wget https://go.dev/dl/go1.23.linux-amd64.tar.gz ``` 此操作会从官网拉取适用于AMD64架构Linux环境下的Go 1.23发行版[^1]。 #### 解压归档文件至指定位置 一旦下载完毕,则需解压缩所获得的`.tar.gz`档案到预期目录下,默认情况下推荐放置于`/usr/local`路径之中: ```bash sudo tar -C /usr/local -xzf go1.23.linux-amd64.tar.gz ``` 上述脚本实现了将存档内容释放的过程,并定位到了根用户的程序空间内。 #### 设置环境变量 为了让全局范围内的shell能够识别新安装的语言解释器及其关联工具集,在个人配置文件里追加必要的PATH声明显得尤为重要;这通常涉及到编辑家目录中的`.profile`或是其他初始化文档之一(比如`.bashrc`, `.zshrc`等),加入如下行: ```bash export PATH=$PATH:/usr/local/go/bin ``` 通过这种方式确保每次启动新的终端实例时都能自动加载这些设置,从而允许直接调用`go`命令而无需全限定名[^3]。 #### 验证安装成功与否 最后一步便是确认整个过程无误——即验证是否能正常响应来自命令行界面发出的相关请求。输入下面这条语句即可查看已部署好的引擎详情以及其内部组件的状态报告: ```bash go version ``` 如果一切顺利的话,屏幕上将会显示出有关刚刚安置下来的软件产品的确切信息,表明此次作业圆满完成[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值