41

golang 平行赋值探讨

 5 years ago
source link: https://studygolang.com/articles/14307?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

i, j = j, i

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

  1. 计算等号左边的操作数的索引表达式和取址表达式,计算等号右边的表达式。
  2. 赋值

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

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并发编程一书》


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK