Go 1.22版本:史诗级升级,快速拼接与零化改造

发表时间: 2024-03-11 15:16

Go1.22在上个月6号发布了一系列重要的更新。对于我们程序员来说,标准库的更新会直接影响到我们的编码的。

下面来看看几个最重要的更新


第一个,切片的拼接

新增了slices.Concat 方法,在这之前我们一般会用标准库内置的append 函数来做。

go在标准库的工具方面的发展显得比较慢,很多看似简单的工具方法,在标准库里都没有,虽然可以借助类似append 来实现。

 package mainimport (    "fmt"    "slices")func main() {    s1 := []string{"Apple", "MI"}    s2 := []string{"HW", "VIVO"}    s3 := []string{"pp", "cc"}    s4 := slices.Concat(s1, s2, s3)    fmt.Printf("cap: %d, len: %d\n", cap(s4), len(s4))    fmt.Println(s4)}

打印结果

cap: 6, len: 6[Apple MI maps HW VIVO pp cc]


第二个,零化改造

也是对切片的更新,对于切片s,如果移除了其中的一部分元素,那么在s中被移除的元素位置上的值是一个零值,以前的行为是被移除的元素在s里面没有了。

package mainimport (        "fmt"        "slices")func main() {        s1 := []int{1, 2, 3, 4, 5}        s2 := slices.Delete(s1, 2, 4)        fmt.Println(s1)        fmt.Println(s2)}

与之一样的处理的函数还要有DeleteFunc,Compact(去掉重复的元素),CompactFunc,Replace。

有兴趣的同学可以去写一下这些函数的新用法姿势。


第三个,插入越界提醒

对切片进行插入的时候,如果插入的索引越过一定当前切片的最大限度,会panic,以前的行为是会插入失败,但是没有提示的。

package mainimport (        "fmt"        "slices")func main() {        s1 := []string{"程序员", "陈明勇"}        s2 := slices.Insert(s1, 3)        fmt.Println(s2)}

报错提示:panic: runtime error: slice bounds out of range [3:2]

可见,对于结果没有影响似乎可有可无的代码设计决定,谷歌的大佬们的决定也是有不可取的地方。

容易产生很多误导的理解和行为的信息省略不是好的省略。


第四个,for 循环语义改变

for循环里面的变量,一般是index value ,现在是每一次循环,它们的值都反应每次循环时候的值,以前是不变的。

ideas := []string{"Goland", "VS Code", "IntelliJ IDEA"}    for i, v := range ideas {        go func() {            fmt.Println(i, v)                  }()    }//支持整型变量的循环  for i := range 3 {                fmt.Println(i)        }

这样的更新让go里面的for和其他语言的含义就一样了。

不得不说,有时候go的行为上比较特立独行的。任何设计都会有在那个时代的局限和权衡取舍,顺时代发展改进的语言才有新的活力。