跳转到主要内容
模块 1 · 第 4 课(共 5)课程中的4/50~8 min
模块课程(4/5)

运营商

Go 拥有您所期望的经典运算符,几乎没有什么惊喜: 算术、比较、逻辑、按位。没有三元运算符 (a ? b : c),没有重载,没有类型之间的隐式转换。 简单是一个特点。

算术

Go
a, b := 10, 3
fmt.Println(a + b)  // 13
fmt.Println(a - b)  // 7
fmt.Println(a * b)  // 30
fmt.Println(a / b)  // 3   ← divisione INTERA tra interi
fmt.Println(a % b)  // 1   ← resto (modulo)

自增和自减是语句,而不是表达式

x++ 和 x-- 不会产生值:它们是“操作”,什么也没有 更多。没有像 C 中那样的 y := x++ 。

Go
x := 5
x++          // ok: incrementa x
// y := x++  // ERRORE di compilazione
fmt.Println(x) // 6

比较

== != < <= > >= 返回bool。它们适用于数字和字符串;为了 结构的所有字段必须是可比较的(内部没有切片/映射)。

Go
"abc" == "abc"  // true
"abc" < "abd"   // true (ordine lessicografico)
3 != 4           // true

逻辑与短路

&&、||、!。他们从左到右短路:如果第一个 操作数足以确定结果,第二个不是偶数 评价。

Go
adult := age >= 18
seniorAdult := age >= 18 && age < 65

按位

& AND、| OR、^ XOR、<< 左移、>> 右移、&^ AND 不是(有点清楚)。它们对于标志、二进制解析和 优化:

Go
flags := uint8(0b0000_0011)
flags |= 0b0000_0100   // imposta un bit:    0000_0111
flags &^= 0b0000_0010  // cancella un bit:   0000_0101
hasFlag := flags & 0b0000_0100 != 0  // true

没有隐式转换

Go 中的 1 + 1.5 可以编译,因为两者都是无类型文字。 但 var i int = 1; i + 1.5 不:您需要 float64(i) + 1.5。

Go
i := 1
f := 1.5
// i + f          // ERRORE
float64(i) + f    // 2.5

轮到你了

锻炼#go.m1.l4.e1
尝试:0加载中...

计算 17 除以 5 的余数并打印出来。预计:2。

正在加载编辑器...
显示提示

模运算符是“%”。

3 次尝试后可用的解决方案

锻炼#go.m1.l4.e2
尝试:0加载中...

如果年龄在 18 岁到 65 岁之间,则打印 true,否则打印 false。

正在加载编辑器...
显示提示

用“&&”组合两个比较。

3 次尝试后可用的解决方案

Quiz#go.m1.l4.e3
准备好

这段代码打印什么?

Go
a, b := 7, 2
fmt.Println(a/b, a%b)
答案选项

回顾

  • 经典算术; int 之间的 / 是整数除法(截断)。
  • ++ 和 -- 是语句,而不是表达式:无 y := x++。
  • 比较和逻辑运算符产生 bool; &&/|| 短路。
  • 按位 & | ^ << >> &^ 用于标志和二进制解析。
  • 不同类型之间没有隐式转换:使用 type(x)。