跳到主要内容

运算符

算术运算符有哪些? 整数除法与取余如何计算?​

  • 整数除法: 商向零截断,余数满足 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)
}