关于golang中平行赋值浅析
2018-08-19 14:09
561 查看
对于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中IO相关的Buffer类浅析
- 关于阻塞赋值和非阻塞赋值的浅析
- golang 关于golang.org/x包问题
- SHELL 关于变量的赋值和脚本中的子SHELL中变量的变化
- 关于给控件的DataSoure赋值
- 关于java多线程浅析一:简单实现生产消费模式
- 30、关于赋值和引用
- golang---利用反射机制对结构体进行循环赋值
- 关于Golang语言的web编程的实例及常见问题 推荐
- 关于js赋值给input解析
- 关于数组给指针赋值的问题
- jquery关于select框的取值和赋值
- C++ 类继承与对象赋值 情况下 成员变量的覆盖 浅析
- 关于在自定义初始化方法里给text赋值失败的解决
- 关于Delphi中的字符串的浅析
- 关于动态语句执行给变量赋值
- 关于 将一个数组赋值给另外一个数组会重置原来数组的指针 的问题
- 关于协程:nodejs和golang协程的不同
- 一个讨论引发关于js中函数声明,函数表达式,形参与变量声明赋值引发的一些事
- 关于easyui中numberbox赋值问题