- 介绍
- 标记
- 源码表示法
- 词汇元素
- 常量
- 变量
- 类型
- 方法集
- 布尔类型
- 数字类型
- 字符串类型
- 数组类型
- 切片类型
- 结构体类型
- 指针类型
- 函数类型
- 接口类型
- Map 类型
- Channel 类型
- 类型的属性和值
- 代码块
- 声明和作用域
- 标签的作用域
- Iota
- 类型声明
- 变量声明
- 短变量声明
- 函数声明
- 方法声明
- 表达式
- 语句
- switch 语句
- for 语句
- Go 语句
- select 语句
- return 语句
- break 语句
- continue 语句
- goto 语句
- Fallthrough 语句
- Defer 语句
- 内置函数
- Close
- 长度和容积
- 内存分配
- 创建切片、map 和 管道
- 追加或者拷贝切片
- 删除 map 中的元素
- 操作复数
- 处理 panic
- 初始化
- 程序的初始化和执行
- 系统相关
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
赋值
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}
在赋值语句中每个值都必须能分配给左侧指定类型的值。除了以下特例:
-
任何类型都能分配给空标识符。
-
如果把无类型常量分配给接口类型或者空标识符,它会转换成默认类型。
-
如果无类型的布尔值分配给了接口类型或者空标识符,它会先转换成
bool
类型。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论