首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Go中的同步变量分配与个体变量分配

Go中的同步变量分配与个体变量分配
EN

Stack Overflow用户
提问于 2016-03-11 22:59:06
回答 3查看 106关注 0票数 4

我的印象是,尽管语法上存在差异,但下面的函数a和函数b在逻辑上是等价的。然而,它们不是,我也不理解它们之间的区别。

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

  • 变量z的x值,
  • 变量x的y值,以及
  • 变量y的x+y值。

谁能帮我澄清我对多变量赋值的误解,以及函数a和函数b之间的逻辑区别?

代码语言:javascript
运行
复制
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
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-11 23:15:38

赋值可以被认为是一种“原子”操作。也就是说,认为=左侧的所有值都是“冻结”的,直到所有操作都完成为止,这是很有用的。

考虑以下方案:

代码语言:javascript
运行
复制
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
}

如果没有这种“冻结”行为,您将得到2xy,这可能不是您期望的代码。对这种“冻结”行为的语义进行推理也可能比采用“级联”方法更容易。

票数 5
EN

Stack Overflow用户

发布于 2016-03-11 23:05:02

Go程序设计语言规范 作业 左边的操作数必须等于右边的表达式数,每个表达式必须是单值的,右边的第n个表达式分配给左边的第n个操作数: 一,二,三=‘一’,‘二’,‘三’ 空白标识符提供了一种在赋值中忽略右侧值的方法: _=x //计算x但忽略它x,_= f() //计算f()但忽略第二个结果值 这项工作分两个阶段进行。首先,左边的索引表达式和指针间接的操作数(包括选择器中的隐式指针)和右边的表达式都按照通常的顺序计算。第二,作业从左到右依次进行.

元组分配是两个阶段的分配。首先,左边的索引表达式和指针间接的操作数(包括选择器中的隐式指针)和右边的表达式都按照通常的顺序计算。第二,作业从左到右依次进行.

例如,

代码语言:javascript
运行
复制
package main

import "fmt"

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

    // phase 1
    tx := x
    ty := y

    // phase 2
    z = tx
    x = ty
    y = tx + ty

    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()) 
    fmt.Println(b()) 
}

输出:

代码语言:javascript
运行
复制
2 3 1
2 3 1
票数 2
EN

Stack Overflow用户

发布于 2016-03-11 23:08:17

简单的答案是,因为它都是一条语句,而且在计算y时,x+y的值还没有更新到2。在任何赋值之前,对右手边的表达式进行评估。在另一种情况下,每件事情都是一次同步发生的,因此ofc y的值已经更新为2,您将得到4个。

有趣的问题,为了学术目的,可怕的代码在现实生活中,所以请不要写这样的东西在一个真正的程序。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35951423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档