欢迎来到代码驿站!

Golang

当前位置:首页 > 脚本语言 > Golang

关于golang中平行赋值浅析

时间:2021-06-25 09:28:15|栏目: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并发编程一书》

总结

上一篇:Golang中使用JSON的一些小技巧分享

栏    目:Golang

下一篇:golang 实现struct、json、map互相转化

本文标题:关于golang中平行赋值浅析

本文地址:http://www.codeinn.net/misctech/147898.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有