登录
首页 >  Golang >  Go教程

关于golang中平行赋值浅析

来源:脚本之家

时间:2022-12-28 13:52:34 219浏览 收藏

在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《关于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的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>