运算符用于执行各种运算操作,如加减乘除、比较大小、逻辑判断等。本章将详细介绍 Go 语言的运算符。
Go 语言的运算符分为以下几类:
| 类别 | 说明 |
|---|---|
| 算术运算符 | 加减乘除等数学运算 |
| 比较运算符 | 比较两个值的大小 |
| 逻辑运算符 | 与、或、非等逻辑运算 |
| 位运算符 | 对二进制位进行操作 |
| 赋值运算符 | 赋值和复合赋值 |
算术运算符用于执行数学运算。
| 运算符 | 说明 | 示例 | 结果 |
|---|---|---|---|
+ | 加 | 10 + 5 | 15 |
- | 减 | 10 - 5 | 5 |
* | 乘 | 10 * 5 | 50 |
/ | 除 | 10 / 5 | 2 |
% | 取余 | 10 % 3 | 1 |
++ | 自增 | i++ | i = i + 1 |
-- | 自减 | i-- | i = i - 1 |
package main
import "fmt"
func main() {
a, b := 10, 3
fmt.Printf("a + b = %d\n", a+b)
fmt.Printf("a - b = %d\n", a-b)
fmt.Printf("a * b = %d\n", a*b)
fmt.Printf("a / b = %d\n", a/b)
fmt.Printf("a %% b = %d\n", a%b)
}
输出:
a + b = 13
a - b = 7
a * b = 30
a / b = 3
a % b = 1
整数除法会向下取整:
package main
import "fmt"
func main() {
a, b := 10, 3
result := a / b
fmt.Printf("10 / 3 = %d\n", result)
f1 := 10.0 / 3
fmt.Printf("10.0 / 3 = %f\n", f1)
}
输出:
10 / 3 = 3
10.0 / 3 = 3.333333
package main
import "fmt"
func main() {
i := 10
i++
fmt.Printf("i++ = %d\n", i)
i--
fmt.Printf("i-- = %d\n", i)
}
注意:Go 的自增自减只能作为语句,不能作为表达式:
i := 10
j := i++
+ 运算符可以用于字符串拼接:
package main
import "fmt"
func main() {
s1 := "Hello"
s2 := "World"
result := s1 + ", " + s2 + "!"
fmt.Println(result)
}
输出:
Hello, World!
比较运算符用于比较两个值,返回布尔值。
| 运算符 | 说明 | 示例 | 结果 |
|---|---|---|---|
== | 等于 | 10 == 10 | true |
!= | 不等于 | 10 != 5 | true |
> | 大于 | 10 > 5 | true |
< | 小于 | 10 < 5 | false |
>= | 大于等于 | 10 >= 10 | true |
<= | 小于等于 | 10 <= 5 | false |
package main
import "fmt"
func main() {
a, b := 10, 5
fmt.Printf("a == b: %v\n", a == b)
fmt.Printf("a != b: %v\n", a != b)
fmt.Printf("a > b: %v\n", a > b)
fmt.Printf("a < b: %v\n", a < b)
fmt.Printf("a >= b: %v\n", a >= b)
fmt.Printf("a <= b: %v\n", a <= b)
}
输出:
a == b: false
a != b: true
a > b: true
a < b: false
a >= b: true
a <= b: false
浮点数比较要注意精度问题:
package main
import (
"fmt"
"math"
)
func main() {
a := 0.1 + 0.2
b := 0.3
fmt.Printf("直接比较: %v\n", a == b)
fmt.Printf("a = %.17f\n", a)
fmt.Printf("b = %.17f\n", b)
diff := math.Abs(a - b)
fmt.Printf("差值比较: %v\n", diff < 1e-9)
}
输出:
直接比较: false
a = 0.29999999999999999
b = 0.29999999999999999
差值比较: true
逻辑运算符用于布尔值的逻辑运算。
| 运算符 | 说明 | 示例 | 结果 |
|---|---|---|---|
&& | 逻辑与 | true && false | false |
|| | 逻辑或 | true || false | true |
! | 逻辑非 | !true | false |
两边都为 true 才返回 true:
package main
import "fmt"
func main() {
a, b := true, false
fmt.Printf("true && true = %v\n", true && true)
fmt.Printf("true && false = %v\n", a && b)
fmt.Printf("false && false = %v\n", false && false)
}
输出:
true && true = true
true && false = false
false && false = false
有一边为 true 就返回 true:
package main
import "fmt"
func main() {
a, b := true, false
fmt.Printf("true || true = %v\n", true || true)
fmt.Printf("true || false = %v\n", a || b)
fmt.Printf("false || false = %v\n", false || false)
}
输出:
true || true = true
true || false = true
false || false = false
取反:
package main
import "fmt"
func main() {
fmt.Printf("!true = %v\n", !true)
fmt.Printf("!false = %v\n", !false)
}
输出:
!true = false
!false = true
逻辑运算符有短路特性:
package main
import "fmt"
func main() {
a := false
b := true
if a && expensiveOperation() {
fmt.Println("不会执行")
}
if b || expensiveOperation() {
fmt.Println("会执行")
}
}
func expensiveOperation() bool {
fmt.Println("执行了耗时操作")
return true
}
位运算符对整数的二进制位进行操作。
| 运算符 | 说明 | 示例 |
|---|---|---|
& | 按位与 | 5 & 3 |
| | 按位或 | 5 | 3 |
^ | 按位异或 | 5 ^ 3 |
<< | 左移 | 5 << 1 |
>> | 右移 | 5 >> 1 |
&^ | 按位清除 | 5 &^ 3 |
对应位都为 1 才为 1:
package main
import "fmt"
func main() {
a := 5
b := 3
fmt.Printf("5 的二进制: %04b\n", a)
fmt.Printf("3 的二进制: %04b\n", b)
fmt.Printf("5&3 的二进制: %04b (十进制: %d)\n", a&b, a&b)
}
输出:
5 的二进制: 0101
3 的二进制: 0011
5&3 的二进制: 0001 (十进制: 1)
对应位有一个为 1 就为 1:
package main
import "fmt"
func main() {
a := 5
b := 3
fmt.Printf("5 的二进制: %04b\n", a)
fmt.Printf("3 的二进制: %04b\n", b)
fmt.Printf("5|3 的二进制: %04b (十进制: %d)\n", a|b, a|b)
}
输出:
5 的二进制: 0101
3 的二进制: 0011
5|3 的二进制: 0111 (十进制: 7)
对应位不同为 1,相同为 0:
package main
import "fmt"
func main() {
a := 5
b := 3
fmt.Printf("5 的二进制: %04b\n", a)
fmt.Printf("3 的二进制: %04b\n", b)
fmt.Printf("5^3 的二进制: %04b (十进制: %d)\n", a^b, a^b)
}
输出:
5 的二进制: 0101
3 的二进制: 0011
5^3 的二进制: 0110 (十进制: 6)
package main
import "fmt"
func main() {
a := 5
fmt.Printf("5 的二进制: %04b\n", a)
fmt.Printf("5<<1 的二进制: %04b (十进制: %d)\n", a<<1, a<<1)
fmt.Printf("5>>1 的二进制: %04b (十进制: %d)\n", a>>1, a>>1)
}
输出:
5 的二进制: 0101
5<<1 的二进制: 1010 (十进制: 10)
5>>1 的二进制: 0010 (十进制: 2)
判断奇偶:
package main
import "fmt"
func main() {
n := 7
if n&1 == 1 {
fmt.Printf("%d 是奇数\n", n)
} else {
fmt.Printf("%d 是偶数\n", n)
}
}
交换两数:
package main
import "fmt"
func main() {
a, b := 10, 20
fmt.Printf("交换前: a=%d, b=%d\n", a, b)
a = a ^ b
b = a ^ b
a = a ^ b
fmt.Printf("交换后: a=%d, b=%d\n", a, b)
}
var a int = 10
| 运算符 | 示例 | 等价于 |
|---|---|---|
+= | a += 5 | a = a + 5 |
-= | a -= 5 | a = a - 5 |
*= | a *= 5 | a = a * 5 |
/= | a /= 5 | a = a / 5 |
%= | a %= 5 | a = a % 5 |
&= | a &= 5 | a = a & 5 |
|= | a |= 5 | a = a | 5 |
^= | a ^= 5 | a = a ^ 5 |
<<= | a <<= 5 | a = a << 5 |
>>= | a >>= 5 | a = a >> 5 |
package main
import "fmt"
func main() {
a := 10
a += 5
fmt.Printf("a += 5: %d\n", a)
a -= 3
fmt.Printf("a -= 3: %d\n", a)
a *= 2
fmt.Printf("a *= 2: %d\n", a)
a /= 4
fmt.Printf("a /= 4: %d\n", a)
}
输出:
a += 5: 15
a -= 3: 12
a *= 2: 24
a /= 4: 6
运算符优先级从高到低:
| 优先级 | 运算符 |
|---|---|
| 1(最高) | *, /, %, <<, >>, &, &^ |
| 2 | +, -, |, ^ |
| 3 | ==, !=, <, <=, >, >= |
| 4 | && |
| 5(最低) | || |
package main
import "fmt"
func main() {
result := 2 + 3*4
fmt.Printf("2 + 3 * 4 = %d\n", result)
result = (2 + 3) * 4
fmt.Printf("(2 + 3) * 4 = %d\n", result)
result = 10 > 5 && 5 > 3
fmt.Printf("10 > 5 && 5 > 3 = %v\n", result)
}
输出:
2 + 3 * 4 = 14
(2 + 3) * 4 = 20
10 > 5 && 5 > 3 = true
建议:复杂表达式使用括号明确优先级,提高代码可读性。
本章学习了 Go 语言的运算符:
| 类别 | 运算符 |
|---|---|
| 算术 | +, -, *, /, %, ++, -- |
| 比较 | ==, !=, >, <, >=, <= |
| 逻辑 | &&, ||, ! |
| 位运算 | &, |, ^, <<, >>, &^ |
| 赋值 | =, +=, -=, *=, /=, 等 |