(摘) Go1.22的变化

声明:内容源自网络,版权归原作者所有。若有侵权请在网页聊天中联系我

网文介绍 ,我只是作一些个人记录,并不全面。
据说性能提升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。

相关文章