逻辑运算符 #
一、运算符概述 #
Go语言支持以下逻辑运算符:
| 运算符 | 说明 | 示例 |
|---|---|---|
| && | 逻辑与 | a && b |
| || | 逻辑或 | a || b |
| ! | 逻辑非 | !a |
逻辑运算符操作布尔值,返回布尔值。
二、逻辑与 (&&) #
2.1 基本用法 #
两个操作数都为true时结果为true:
go
fmt.Println(true && true) // true
fmt.Println(true && false) // false
fmt.Println(false && true) // false
fmt.Println(false && false) // false
2.2 真值表 #
| A | B | A && B |
|---|---|---|
| true | true | true |
| true | false | false |
| false | true | false |
| false | false | false |
2.3 短路求值 #
如果第一个操作数为false,不会计算第二个:
go
func returnsFalse() bool {
fmt.Println("不会执行")
return false
}
result := false && returnsFalse()
fmt.Println(result) // false
2.4 实际应用 #
go
age := 25
hasLicense := true
if age >= 18 && hasLicense {
fmt.Println("可以驾驶")
}
三、逻辑或 (||) #
3.1 基本用法 #
任一操作数为true时结果为true:
go
fmt.Println(true || true) // true
fmt.Println(true || false) // true
fmt.Println(false || true) // true
fmt.Println(false || false) // false
3.2 真值表 #
| A | B | A || B |
|---|---|---|
| true | true | true |
| true | false | true |
| false | true | true |
| false | false | false |
3.3 短路求值 #
如果第一个操作数为true,不会计算第二个:
go
func returnsTrue() bool {
fmt.Println("不会执行")
return true
}
result := true || returnsTrue()
fmt.Println(result) // true
3.4 实际应用 #
go
role := "admin"
if role == "admin" || role == "superuser" {
fmt.Println("有管理权限")
}
四、逻辑非 (!) #
4.1 基本用法 #
取反操作:
go
fmt.Println(!true) // false
fmt.Println(!false) // true
4.2 真值表 #
| A | !A |
|---|---|
| true | false |
| false | true |
4.3 实际应用 #
go
isLoggedIn := false
if !isLoggedIn {
fmt.Println("请先登录")
}
五、组合使用 #
5.1 混合运算 #
go
a := true
b := false
c := true
result := a && b || c
fmt.Println(result) // true
result2 := a && (b || c)
fmt.Println(result2) // true
result3 := (a && b) || c
fmt.Println(result3) // true
5.2 复杂条件 #
go
age := 25
hasLicense := true
isDrunk := false
if age >= 18 && hasLicense && !isDrunk {
fmt.Println("可以驾驶")
}
5.3 德摩根定律 #
go
// !(A && B) 等价于 !A || !B
// !(A || B) 等价于 !A && !B
a := true
b := false
fmt.Println(!(a && b) == (!a || !b)) // true
fmt.Println(!(a || b) == (!a && !b)) // true
六、短路求值应用 #
6.1 避免空指针 #
go
var p *Person
if p != nil && p.Name == "Tom" {
fmt.Println("找到Tom")
}
6.2 默认值设置 #
go
func getName(name string) string {
if name == "" {
return "默认名称"
}
return name
}
// 使用短路求值简化
func getName2(name string) string {
return name != "" && name || "默认名称" // 不推荐,可读性差
}
6.3 条件执行 #
go
shouldLog := true
shouldLog && logMessage("操作完成") // Go不支持这种写法
// 正确写法
if shouldLog {
logMessage("操作完成")
}
七、实际应用示例 #
7.1 用户验证 #
go
func validateUser(username, password string) bool {
return username != "" && password != "" && len(password) >= 6
}
fmt.Println(validateUser("admin", "123456")) // true
fmt.Println(validateUser("admin", "123")) // false
7.2 权限检查 #
go
func hasPermission(user User, resource string) bool {
return user.Role == "admin" ||
user.Role == "manager" ||
contains(user.Permissions, resource)
}
7.3 范围检查 #
go
func isInRange(value, min, max int) bool {
return value >= min && value <= max
}
fmt.Println(isInRange(5, 1, 10)) // true
fmt.Println(isInRange(15, 1, 10)) // false
7.4 多条件筛选 #
go
func filterProducts(products []Product, minPrice, maxPrice float64, inStock bool) []Product {
var result []Product
for _, p := range products {
if p.Price >= minPrice && p.Price <= maxPrice && (p.Stock > 0 || !inStock) {
result = append(result, p)
}
}
return result
}
八、常见错误 #
8.1 运算符优先级 #
go
a := true
b := false
c := true
result := a || b && c // a || (b && c) = true
fmt.Println(result)
result2 := (a || b) && c // true && true = true
fmt.Println(result2)
8.2 位运算混淆 #
go
// 逻辑运算符
fmt.Println(true && false) // false
fmt.Println(true || false) // true
// 位运算符
fmt.Println(1 & 2) // 0
fmt.Println(1 | 2) // 3
8.3 非布尔值 #
Go不支持非布尔值的逻辑运算:
go
// 错误:不能将非布尔值用于逻辑运算
if 1 && 2 { // 编译错误
fmt.Println("true")
}
// 正确
if 1 > 0 && 2 > 0 {
fmt.Println("true")
}
九、最佳实践 #
9.1 使用括号提高可读性 #
go
if (a > 0 && b > 0) || (c > 0 && d > 0) {
fmt.Println("条件满足")
}
9.2 避免复杂表达式 #
go
isAdult := age >= 18
hasLicense := license != nil
isDrunk := bloodAlcohol > 0
if isAdult && hasLicense && !isDrunk {
fmt.Println("可以驾驶")
}
9.3 利用短路求值 #
go
if user != nil && user.IsActive() {
fmt.Println("用户有效")
}
十、总结 #
逻辑运算符要点:
| 运算符 | 说明 | 短路行为 |
|---|---|---|
| && | 逻辑与 | 第一个为false时短路 |
| || | 逻辑或 | 第一个为true时短路 |
| ! | 逻辑非 | 无短路 |
关键点:
- 操作布尔值:只能用于布尔类型
- 短路求值:提高效率,避免不必要的计算
- 优先级:! > && > ||
- 可读性:复杂条件使用括号和中间变量
准备好学习位运算符了吗?让我们进入下一章!
最后更新:2026-03-26