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的行为上比较特立独行的。任何设计都会有在那个时代的局限和权衡取舍,顺时代发展改进的语言才有新的活力。