Go 编程实战系列(十二)
上一篇《Go 数字类型详解》中,我们学习了 Go 中各种数字类型,包括整数、浮点数、数字转换以及数学计算。
本篇继续学习 Go 基础数据类型中的一个重要类型:
arduino
bool
布尔类型虽然只有两个值:
arduino
true
false
但是在实际开发中使用非常广泛。
例如:
-
用户是否登录;
-
商品是否上架;
-
文件是否存在;
-
权限是否通过;
-
数据是否有效;
-
服务是否启动。
几乎所有程序都离不开逻辑判断,而逻辑判断的核心就是布尔类型。
本文将详细介绍:
-
bool 类型特点;
-
true 和 false;
-
布尔变量定义;
-
比较运算;
-
逻辑运算;
-
条件判断;
-
布尔值使用技巧;
-
常见错误。
一、什么是布尔类型?
布尔类型(Boolean)是一种只有两个值的数据类型。
Go 中使用:
arduino
bool
表示。
它只有两个可能值:
arduino
true
表示:
正确
成立
开启
成功
以及:
arduino
false
表示:
错误
不成立
关闭
失败
例如:
go
package main
import "fmt"
func main() {
var isLogin bool = true
fmt.Println(isLogin)
}
输出:
arduino
true
二、bool 类型的特点
Go 中 bool 类型有几个重要特点。
1. 只能保存 true 或 false
例如:
正确:
csharp
var enabled bool = true
正确:
csharp
var enabled bool = false
错误:
csharp
var enabled bool = 1
错误:
csharp
var enabled bool = "true"
Go 不允许数字、字符串自动转换为布尔值。
2. bool 是独立类型
很多编程语言允许:
ini
1 = true
0 = false
例如 C 语言:
scss
if(1)
{
}
表示条件成立。
但是 Go 不支持这种方式。
下面代码错误:
arduino
if 1 {
fmt.Println("执行")
}
Go 要求:
arduino
if true {
fmt.Println("执行")
}
必须明确使用 bool 类型。
3. bool 默认值是 false
Go 中变量如果没有初始化,会自动获得零值。
例如:
go
package main
import "fmt"
func main(){
var ok bool
fmt.Println(ok)
}
输出:
arduino
false
因此:
csharp
var ok bool
等价于:
csharp
var ok bool = false
三、声明 bool 变量
Go 中声明布尔变量有多种方式。
1. 使用 var
完整写法:
csharp
var isLogin bool = true
也可以:
csharp
var isLogin bool
默认:
arduino
false
2. 自动类型推导
使用:
go
:=
例如:
go
isLogin := true
Go 自动推导:
arduino
isLogin 类型为 bool
这是开发中最常见的方式。
四、布尔类型与条件判断
bool 最大的作用就是控制程序流程。
例如:
go
isLogin := true
if isLogin {
fmt.Println("用户已经登录")
}
执行结果:
用户已经登录
如果:
go
isLogin := false
条件不会执行。
五、比较运算产生 bool
在 Go 中,比较表达式的结果都是 bool 类型。
例如:
go
age := 20
result := age >= 18
fmt.Println(result)
输出:
arduino
true
这里:
age >= 18
返回:
arduino
bool
常见比较运算符:
| 运算符 | 含义 |
|---|---|
| == | 等于 |
| != | 不等于 |
| 大于 | |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |
例如:
css
a := 10
b := 20
fmt.Println(a == b)
fmt.Println(a < b)
fmt.Println(a != b)
输出:
arduino
false
true
true
六、字符串比较
字符串也可以进行比较。
例如:
go
name1 := "Go"
name2 := "Go"
fmt.Println(name1 == name2)
输出:
arduino
true
常见用途:
判断:
-
用户名;
-
状态;
-
类型名称。
例如:
go
role := "admin"
if role == "admin" {
fmt.Println("管理员")
}
七、逻辑运算
实际业务中,一个判断往往包含多个条件。
例如:
用户登录系统:
要求:
-
用户名正确;
-
密码正确。
这时需要逻辑运算。
Go 提供三个逻辑运算符:
diff
&&
||
!
八、&& 与运算
符号:
&&
表示:
并且。
只有两个条件都为 true,结果才是 true。
例如:
go
usernameOK := true
passwordOK := true
result := usernameOK && passwordOK
fmt.Println(result)
结果:
arduino
true
如果:
go
usernameOK := true
passwordOK := false
结果:
arduino
false
逻辑表:
| A | B | A && B |
|---|---|---|
| false | false | false |
| false | true | false |
| true | false | false |
| true | true | true |
实际开发:
用户登录:
arduino
if usernameOK && passwordOK {
fmt.Println("登录成功")
}
九、|| 或运算
符号:
||
表示:
或者。
只要有一个条件为 true,结果就是 true。
例如:
go
isAdmin := false
isOwner := true
result := isAdmin || isOwner
fmt.Println(result)
输出:
arduino
true
逻辑表:
| A | B | A |
|---|---|---|
| false | false | false |
| false | true | true |
| true | false | true |
| true | true | true |
例如:
权限判断:
arduino
if isAdmin || isManager {
fmt.Println("允许访问")
}
十、! 非运算
符号:
diff
!
表示:
取反。
例如:
go
enabled := true
fmt.Println(!enabled)
输出:
arduino
false
再例如:
go
disabled := false
if !disabled {
fmt.Println("功能开启")
}
输出:
功能开启
十一、逻辑短路
Go 的逻辑运算支持短路。
也就是说:
如果前面的条件已经确定结果,后面的条件不会执行。
&& 短路
例如:
arduino
false && xxx
因为:
arduino
false && 任意值
一定是:
arduino
false
所以后面的条件不会执行。
示例:
go
func check() bool {
fmt.Println("执行检查")
return true
}
func main(){
result := false && check()
fmt.Println(result)
}
输出:
arduino
false
不会输出:
执行检查
|| 短路
例如:
arduino
true || xxx
结果一定:
arduino
true
后面的条件不会执行。
短路机制非常重要。
例如:
go
if user != nil && user.Name != "" {
fmt.Println(user.Name)
}
如果:
ini
user == nil
第二个条件不会执行。
避免:
空指针错误
十二、bool 与函数返回值
Go 中很多函数会返回 bool 表示成功或失败。
例如:
csharp
func checkLogin() bool {
return true
}
调用:
csharp
if checkLogin() {
fmt.Println("登录成功")
}
标准库中也大量使用这种设计。
例如:
判断 Map 是否存在:
go
value, ok := map[key]
其中:
ok
就是 bool 类型。
例如:
go
user := map[string]string{
"name":"Tom",
}
value, ok := user["name"]
fmt.Println(value)
fmt.Println(ok)
输出:
arduino
Tom
true
十三、布尔类型最佳实践
1. 使用有意义的变量名称
不好:
go
a := true
推荐:
go
isLogin := true
例如:
hasPermission
isDeleted
enabled
isActive
这些名称更容易理解。
2. 避免重复比较 true
不推荐:
ini
if isLogin == true {
}
推荐:
if isLogin {
}
更加符合 Go 风格。
错误:
ini
if enabled == false {
}
推荐:
yaml
if !enabled {
}
3. 使用 bool 表达状态
例如:
不推荐:
go
status := 1
表示开启。
推荐:
go
enabled := true
代码可读性更高。
十四、bool 与 JSON
在 Web 开发中,bool 非常常见。
例如:
用户信息:
go
type User struct {
Name string `json:"name"`
Active bool `json:"active"`
}
JSON:
json
{
"name":"Tom",
"active":true
}
前后端交互中:
-
是否启用;
-
是否删除;
-
是否审核;
通常使用 bool。
十五、常见错误
1. 使用数字代替 bool
错误:
csharp
var enabled int = 1
虽然某些语言允许:
arduino
1 表示 true
0 表示 false
但是 Go 不允许。
2. bool 不能参与数学运算
错误:
go
enabled := true
result := enabled + 1
bool 不能:
-
加;
-
减;
-
乘;
-
除。
3. 变量名称不清晰
错误:
go
flag := true
虽然可以运行,但是含义不明确。
推荐:
go
isEnabled := true
十六、完整示例
go
package main
import "fmt"
func main(){
username := "admin"
passwordOK := true
isAdmin := true
if username == "admin" && passwordOK {
fmt.Println("登录成功")
}
if isAdmin || passwordOK {
fmt.Println("允许操作")
}
enabled := true
fmt.Println(!enabled)
}
输出:
arduino
登录成功
允许操作
false
十七、本章小结
本篇学习了 Go 中的布尔类型。
重点内容:
-
bool 只有 true 和 false;
-
bool 默认值是 false;
-
Go 不支持数字代替 bool;
-
比较运算返回 bool;
-
使用 && 表示并且;
-
使用 || 表示或者;
-
使用 ! 表示取反;
-
逻辑运算支持短路;
-
bool 广泛用于业务状态判断。
布尔类型虽然简单,但是它是程序逻辑控制的基础。
后续学习:
-
if 条件判断;
-
switch;
-
for 循环;
-
权限系统;
-
Web 业务逻辑;
都会大量使用 bool。
本章练习
- 创建一个 bool 变量表示用户是否登录。
- 创建两个 bool 判断用户名和密码是否正确。
- 使用 && 判断登录条件。
- 使用 || 判断管理员或普通用户权限。
- 使用 ! 判断功能是否关闭。
- 编写一个函数返回 bool 判断用户是否存在。
- 使用 Map 查询时处理返回的 bool 值。
下一篇预告
《Go 类型转换详解》
下一篇将深入介绍 Go 中的类型转换,包括:
-
为什么 Go 不支持隐式转换;
-
数字类型转换;
-
字符串与数字转换;
-
strconv 包使用;
-
类型转换常见错误;
-
类型断言;
-
interface 类型转换。
掌握类型转换,是理解 Go 类型系统的重要一步。