返回介绍

赋值

发布于 2024-10-12 12:51:53 字数 1960 浏览 0 评论 0 收藏 0

Assignment = ExpressionList assign_op ExpressionList .

assign_op = [ add_op | mul_op ] "=" .

所有左侧运算元都必须是可寻址的、map 索引表达式或空标识符其中之一。运算元可以用括号括起来。

x = 1
*p = f()
a[i] = 23
(k) = <-ch  // same as: k = <-ch

对于赋值操作 x op= y 其中 op 为二元运算符,它和 x=x op (y) 是等价的,不过它只计算一次 x。 op= 是单独的一个词汇单元,在赋值操作中左侧表达式和右侧表达式必须都是单值表达式,并且左侧表达式不能是空白标识符。

a[i] <<= 2
i &^= 1<<n

元祖赋值语句会把运算返回的多个值分别分配给变量列表。它有两种格式,第一种:它是返回多值的表达式,例如函数调用、通道和 map 运算、类型断言。左侧运算元的数量必须等于返回值的数量。如果函数返回两个值:

x, y = f()

它会将第一个返回值分配给 x ,把第二个返回值分配给 y。第二种格式中,左侧运算元的数量必须等于右侧运算元的数量。每个表达式都只能返回单一值,右侧第 n 个值会赋值给左侧第 n 个变量。

one, two, three = '一', '二', '三'

空标识符可以在分配时忽略一个右面位置的表达式:

_ = x       // evaluate x but ignore it
x, _ = f()  // evaluate f() but ignore second result value

赋值分为两个阶段。首先会计算左侧运算元的索引表达式和指针的解引用工作并以一定顺序计算右侧表达式的值。

然后依次对左侧运算元赋值。

a, b = b, a  // exchange a and b

x := []int{1, 2, 3}
i := 0
i, x[i] = 1, 2  // set i = 1, x[0] = 2

i = 0
x[i], i = 2, 1  // set x[0] = 2, i = 1

x[0], x[0] = 1, 2  // set x[0] = 1, then x[0] = 2 (so x[0] == 2 at end)

x[1], x[3] = 4, 5  // set x[1] = 4, then panic setting x[3] = 5.

type Point struct { x, y int }
var p *Point
x[2], p.x = 6, 7  // set x[2] = 6, then panic setting p.x = 7

i = 2
x = []int{3, 5, 7}
for i, x[i] = range x {  // set i, x[2] = 0, x[0]
	break
}
// after this loop, i == 0 and x == []int{3, 5, 3}

在赋值语句中每个值都必须能分配给左侧指定类型的值。除了以下特例:

  1. 任何类型都能分配给空标识符。

  2. 如果把无类型常量分配给接口类型或者空标识符,它会转换成默认类型。

  3. 如果无类型的布尔值分配给了接口类型或者空标识符,它会先转换成 bool 类型。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文