对于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默认赋值类型,golang教程,golangmap指针赋值

免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
评论“关于golang中平行赋值浅析”
暂无“关于golang中平行赋值浅析”评论...

RTX 5090要首发 性能要翻倍!三星展示GDDR7显存

三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。

首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。

据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。