运算符
算术运算符有哪些? 整数除法与取余如何计算?
- 整数除法: 商向零截断,余数满足
a = (a/b)*b + a%b;负数取余的符号与被除数一致,整数除以零会失败;
| 运算符 | 描述 |
|---|---|
+ | 加法, 字符串拼接 |
- | 减法 |
* | 乘法 |
/ | 除法 |
% | 取余, 仅整数 |
func main() {
println(7 / 2) // 整数除法结果为 3
println(7 % 2) // 整数取余结果为 1
println("go" + "lang") // 字符串拼接
}
比较运算符有哪些? 哪些类型可比较?
- 比较结果: bool;
- 相等比较: bool、数值、string、pointer、channel,以及满足条件的 array、struct、interface 可使用
==与!=; - 有序比较:
<、<=、>、>=仅适用于整数、浮点数和字符串,不能套用到 bool、复数、指针或接口; - 接口边界: 动态类型相同但不可比较时,比较接口会 panic;动态值规则见interface 值;
- 不可比较类型: slice、map、function 只能与 nil 比较,不能对两个此类值做相等比较;
| 运算符 | 描述 |
|---|---|
== | 相等 |
!= | 不相等 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
逻辑运算符有哪些? 逻辑与、或、非如何写?
- 短路求值:
&&在左侧为 false 时跳过右侧,||在左侧为 true 时跳过右侧;因此可先判断指针非 nil,再访问目标;
func main() {
a := true
b := false
println(a && b) // 逻辑与
println(a || b) // 逻辑或
println(!a) // 逻辑非
}
位运算符有哪些? 按位清除如何计算?
| 运算符 | 描述 |
|---|---|
& | 按位与 |
| | 按位或 |
^ | 按位异或或一元按位取反 |
&^ | 按位清除 |
<< | 左移 |
>> | 右移 |
func main() {
var flags uint = 0b1010
println(flags & 0b0010) // 按位与
println(flags &^ 0b1000) // 清除指定二进制位, 结果为 0b0010
}
赋值运算符有哪些? 复合赋值如何简写?
- 复合赋值:
x op= y把计算与写回合为一句,左侧定位表达式只求值一次;++、--是语句,不能作为表达式返回值;
func main() {
n := 1
n += 2 // 等价于 n = n + 2
n <<= 1 // 等价于 n = n << 1
println(n)
}