一尘不染

Go中的同时变量分配不同于单个变量分配

go

我的印象是,尽管语法有所不同,但下面的函数a和b在逻辑上是等效的。但是,它们不是,我也不了解它们之间的区别。

在我看来,他们俩都在分配:

  • x对变量z的值,
  • y的值对应于变量x,并且
  • x + y的值等于变量y。

有人能帮助消除我对多变量分配以及函数a和函数b之间的逻辑差异的误解吗?

package main

import "fmt"

func a() (int, int, int) {
    x:=1
    y:=2
    z:=3

    z = x
    x = y
    y = x+y

    return x, y, z
}

func b() (int, int, int) {
    x:=1
    y:=2
    z:=3

    z, x, y = x, y, x+y

    return x, y, z
}

func main() {
    fmt.Println(a()) // prints 2 4 1
    fmt.Println(b()) // prints 2 3 1
}

阅读 155

收藏
2020-07-02

共1个答案

一尘不染

分配可以认为是“原子”操作。也就是说,认为在所有=操作完成之前,“ 左侧”的所有值都是“冻结”的,这很有用。

考虑以下程序:

package main

import "fmt"

func swap() (int, int) {
    x := 1
    y := 2
    x, y = y, x
    return x, y
}

func main() {
    fmt.Println(swap()) // prints 2 1
}

如果没有这种“冻结”的行为,你会得到2两个xy,这 可能 不是你从代码中会发生什么。它也 可能是
理智关于这个“冻结”的行为比如果“级联”的方式采取的语义更容易。

2020-07-02