Go程序设计语言2.4 赋值

2.4 赋值


赋值语句用来更新变量所指的值,它最简单的形式由赋值符=,以及符号左边的变量和右边的表达式组成。

 

每一个算术和二进制位操作符有一个对应的赋值操作符,例如,最后的那个语句可以重写成:

 

它避免了在表达式中重复变量本身。

数字变量也可以通过++和--语句进行递增和递减:

 

2.4.1 多重赋值

另一种形式的赋值是多重赋值,它允许几个变量一次性被赋值。在实际更新变量前,右边所有的表达式被推演,当变量同时出现在赋值符两侧的时候这种形式特别有用,例如,当交换两个变量的值时:

 

或者计算两个整数的最大公约数:

 

或者计算斐波那契数列的第n个数:

 

多重赋值也可以使一个普通的赋值序列变得紧凑:

 

从风格上考虑,如果表达式比较复杂,则避免使用多重赋值形式;一系列独立的语句更易读。

这类表达式(例如一个有多个返回值的函数调用)产生多个值。当在一个赋值语句中使用这样的调用时,左边的变量个数需要和函数的返回值一样多。

 

通常函数使用额外的返回值来指示一些错误情况,例如通过os.Open返回的error类型,或者一个通常叫ok的bool类型变量。我们会在后面的章节中看到,这里有三个操作符也有类似的行为。如果map查询(参考4.3节)、类型断言(参考7.10节)或者通道接收动作(参考8.4.2节)出现在两个结果的赋值语句中,都会产生一个额外的布尔型结果:

 

像变量声明一样,可以将不需要的值赋给空标识符:

 

2.4.2 可赋值性

赋值语句是显式形式的赋值,但是程序中很多地方的赋值是隐式的:一个函数调用隐式地将参数的值赋给对应参数的变量;一个return语句隐式地将return操作数赋值给结果变量。复合类型的字面量表达式,例如slice(参考4.2节):

 

隐式地给每一个元素赋值,它可以写成下面这样:

 

map和通道的元素尽管不是普通变量,但它们也遵循相似的隐式赋值。

不管隐式还是显式赋值,如果左边的(变量)和右边的(值)类型相同,它就是合法的。通俗地说,赋值只有在值对于变量类型是可赋值的时才合法。

可赋值性根据类型不同有着不同的规则,我们将会在引入新类型的时候解释相应的规则。对已经讨论过的类型,规则很简单:类型必须精准匹配,nil可以被赋给任何接口变量或引用类型。常量(参考3.6节)有更灵活的可赋值性规则来规避显式的转换。

两个值使用==和!=进行比较与可赋值性相关:任何比较中,第一个操作数相对于第二个操作数的类型必须是可赋值的,或者可以反过来赋值。与可赋值性一样,我们也将解释新类型的可比较性的相关规则。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值