网络编程
位置:首页>> 网络编程>> Go语言>> 关于golang中平行赋值浅析

关于golang中平行赋值浅析

作者:jmycanfly  发布时间:2024-05-05 09:33:42 

标签:golang,平行赋值

对于golang, 交换两个数很简单,如下这么写就可以了:


i, j = j, i

等号左边和右边含有多个表达式,这就是平行赋值。 赋值分为两个步骤:

  • 计算等号左边的操作数的索引表达式和取址表达式,计算等号右边的表达式。

  • 赋值

我们来看下面一段代码会输出什么?


func main() {
i := 1
s := []string{"A", "B", "C"}
i, s[i-1] = 2, "Z"
fmt.Printf("s: %v \n", s)
}

这里输出的 s: [Z,B,C] 而不是s: [A,Z,C]。 这是因为等号左边的切片的索引表达式i-1会被先计算,最后才是赋值。 计算和赋值的顺序,都是从左往右。 我们再来看下面的代码会输出什么?


func main() {
a := []int{1, 2, 3, 4}
defer func(a []int) {
 fmt.Printf("a: %v\n", a)
}(a)
a[0], a[4] = a[1], a[2]
}

输出的是:


a: [2 2 3 4]
panic: runtime error: index out of range

goroutine 1 [running]:

在赋值的过程中,即使后面的引发了panic,前面的也会被赋值成功。 再看这个会输出什么?


func main() {
a := []int{1, 2, 3, 4}
defer func(a []int) {
 fmt.Printf("a: %v\n", a)
}(a)
a[0], a[1] = a[2], a[4]
}

输出的是:


a: [1 2 3 4]
panic: runtime error: index out of range

goroutine 1 [running]:
main.main()

再次理解一下,赋值的第一步,计算等号左边的索引表达式,取址表达式 和 计算等号右边的表达式。

理解参照了《Go并发编程一书》

来源:https://studygolang.com/articles/14307

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com