Golang 1.23 新变化
截止到目前为止,go1.23 的正式版还没有发布,但是其预发布版本,也就是 rc 版本已经开放下载了。初步体验一下
安装
方式一
go install golang.org/dl/go1.23rc1@latest
go1.23rc1 download
方式二
curl -o https://go.dev/dl/go1.23rc2.darwin-arm64.tar.gz
# 编辑.zshrc
export GO111MODULE="on"
export GOROOT="$PWD/go123/go"
export GOPATH="$PWD/gopath"
export GOBIN=$GOROOT/bin
export PATH=$PATH:$GOBIN
export GOPROXY="https://goproxy.cn,direct"
source .zshrc
range over func
Go 1.22 版本 引入了 range over func 试验特性,通过 GOEXPERIMENT=rangefunc。实现函数迭代器。在 1.23 开始,在语法层面上支持用户自定义函数实现迭代器,不需要加任何参数。
运行环境 go1.23
package main
import "fmt"
func Backward[E any](s []E) 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{"a", "b", "c"}
for i, s := range Backward(sl) {fmt.Printf("i: %d, s: %s\n", i, s)
}
}
运行结果:
i: 2, s: c
i: 1, s: b
i: 0, s: a
上述例子实现了索引按倒序排序
对 slice 和 map 增加了一些内置函数。
增加了比如 slices.All()、slices.Backward() 等
代码示例:
package main
import (
"fmt"
"slices"
)
func main() {sl := []string{"a", "b", "c"}
for i, s := range slices.All(sl) {fmt.Printf("i: %d, s: %s\n", i, s)
}
for i, s := range slices.Backward(sl) {fmt.Printf("i: %d, s: %s\n", i, s)
}
}
i: 0, s: a
i: 1, s: b
i: 2, s: c
i: 2, s: c
i: 1, s: b
i: 0, s: a
有可能会限制 linkename 的使用
//go:linkename 指令可用用来链接到标准库或其他包未导出的函数.
runtime.nanotime 返回当前时间的纳秒数
代码示例:
package main
import (
"fmt"
_ "unsafe"
)
//go:linkname nanotime runtime.nanotime
func nanotime() int64
func main() {fmt.Println("current time in nanoseonds: ", nanotime())
}
运行结果:
current time in nanoseonds: 763815666064833
增加 unique 库
代码:
package main
import (
"fmt"
"unique"
)
func main() {a1 := unique.Make("a")
c1 := unique.Make("c")
fmt.Println(a1 == c1)
fmt.Println(a1.Value())
fmt.Println(c1.Value())
}
结果
false
a
c
Timer 和 Ticker 改动
go1.23 对 Timer 和 Ticker 的垃圾回收进行了特殊的处理。早期版本需要调用调用 Stop 方法才会被垃圾回收期回收,因为 Timer 和 Ticker 的实现原理是独立的 goroutine 定时向 chan 写入数据。所以如果不调用 Stop 方法会造成 goroutine 泄露。现在做了特殊的优化,便不调用 Stop 方法,运行时也会检查并回收不用的 Timer 和 Ticker
正文完