Go1.22史诗级更新,快速拼接,零化改造,越界插入优化

一袭白衣战八荒

回首却是孤影人

快乐的秘诀在于

无所谓

不至于

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

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

第一个,切片的拼接

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

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

  
 package main  
  
import (  
    "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 main  
  
import (  
        "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 main  
  
import (  
        "fmt"  
        "slices"  
)  
  
func main() {  
        s1 := []string{"Sora可以拍出阿凡达的视觉盛宴吗", "奥本海默领跑奥斯卡 勇"}  
        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的行为上比较特立独行的。任何设计都会有在那个时代的局限和权衡取舍,顺时代发展改进的语言才有新的活力。

0
0
0
0
评论
未登录
暂无评论