,我只是作一些个人记录,并不全面。
据说性能提升1-3%,内存占用减少1%。启用PGO(Profile-guided Optimization 配置文件引导优化)后,大多数程序的性能提高2%-14%
0
循环的每次迭代都会创建新变量
在 Go 1.22 版本之前,for 循环声明的变量只创建一次,并在每次迭代中更新。在 Go 1.22中,循环的每次迭代都会创建新变量,这将会避免意外的共享错误发生。
1
数字循环。此示例为0-9的循环
package main
import "fmt"
func main() {
for i := range 10 {
fmt.Println(i)
}
}
2
math/rand/v2
伪随机数生成算法的优化及接口一致化
函数 Intn、Int31、Int31n、Int63、Int64n 已分别重命名为 IntN、Int32、Int32N、Int64、Int64N。
添加了一个函数 N,用于生成任意整数类型的随机数。该函数是基于泛型实现的
3
net/http.ServeMux 允许使用模式和通配符路径
例如 GET /task/{id} 这样的路由器,只匹配GET请求,并通过 r.PathValue(“id”) 来获取
注意GET为大写
mux.HandleFunc("POST /eddycjy/create", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "脑子进煎鱼了!")
})
mux.HandleFunc("GET /eddycjy/update", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "煎鱼进脑子了...")
})
...
mux.HandleFunc("/eddycjy/{id}", func(w http.ResponseWriter, r *http.Request) {
id := r.PathValue("id")
fmt.Fprintf(w, "id 值为 %s", id)
})
mux.HandleFunc("/eddycjy/{path...}", func(w http.ResponseWriter, r *http.Request) {
path := r.PathValue("path")
fmt.Fprintf(w, "path 值为 %s", path)
})
...
package main
import (
"fmt"
"net/http"
)
func IndexHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello from route /index")
}
func DynamicHandler(w http.ResponseWriter, r *http.Request) {
param := r.PathValue("param")
fmt.Fprintf(w, "Hello from route /index/%s", param)
}
func main() {
http.HandleFunc("GET /index", IndexHandler)
http.HandleFunc("GET /index/{param}", DynamicHandler)
http.ListenAndServe(":8080", nil)
}
4
多个片段的连接
slices.Concat(a,b,c,d)
import (
"fmt"
"slices"
)
func main() {
s1 := []string{"煎鱼"}
s2 := []string{"炸鱼", "青鱼", "咸鱼"}
s3 := []string{"福寿鱼", "煎鱼"}
resp := slices.Concat(s1, s2, s3)
fmt.Println(resp)
}
5
变更 Delete 等函数行为结果
Go1.22 起,切片经过缩小后新长度和旧长度之间的元素将会归为零值。
Delete
func main() {
s1 := []int{11, 12, 13, 14}
s2 := slices.Delete(s1, 1, 3)
fmt.Println("s1:", s1)
fmt.Println("s2:", s2)
}
新版本的输出结果为
s1: [11 14 0 0]
s2: [11 14]
Compact
func main() {
s1 := []int{11, 12, 12, 12, 15}
s2 := slices.Compact(s1)
fmt.Println("s1:", s1)
fmt.Println("s2:", s2)
}
新版输出结果
s1: [11 12 15 0 0]
s2: [11 12 15]
Replace
func main() {
s1 := []int{11, 12, 13, 14}
s2 := slices.Replace(s1, 1, 3, 99)
fmt.Println("s1:", s1)
fmt.Println("s2:", s2)
}
新版输出结果
s1: [11 99 14 0]
s2: [11 99 14]
Insert
func main() {
s1 := []string{"煎鱼", "炸鱼", "水鱼"}
s2 := slices.Insert(s1, 4)
fmt.Println("s1:", s1)
fmt.Println("s2:", s2)
}
以前没有填入具体要插入的元素,是会正常运行的。在新版本起,会直接导致 panic。