Go 布尔类型 bool 详解

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。


本章练习

  1. 创建一个 bool 变量表示用户是否登录。
  2. 创建两个 bool 判断用户名和密码是否正确。
  3. 使用 && 判断登录条件。
  4. 使用 || 判断管理员或普通用户权限。
  5. 使用 ! 判断功能是否关闭。
  6. 编写一个函数返回 bool 判断用户是否存在。
  7. 使用 Map 查询时处理返回的 bool 值。

下一篇预告

《Go 类型转换详解》

下一篇将深入介绍 Go 中的类型转换,包括:

  • 为什么 Go 不支持隐式转换;

  • 数字类型转换;

  • 字符串与数字转换;

  • strconv 包使用;

  • 类型转换常见错误;

  • 类型断言;

  • interface 类型转换。

掌握类型转换,是理解 Go 类型系统的重要一步。

相关推荐
苏三说技术几秒前
如何看待GPT-6在UP主众测中碾压夺冠?它是现在最强大模型吗?
后端
mldong19 分钟前
一份 JSON,一条能跑的审批流:把报销流程送上工作流引擎
后端·架构
wno70420 分钟前
Spring Boot WebFlux增删改查
java·spring boot·后端
Captaincc24 分钟前
AI用量v0.1.11更新发布 新增 jusage doctor 诊断指令 托盘展示token 和余额 新增 AutoClaw 支持
前端·后端·vibecoding
aramae1 小时前
模拟实现strlen()函数 (C语言)
c语言·开发语言·后端
kyriewen2 小时前
我让 AI 当面试官面了我一轮:第 3 个追问我就卡住了(附 10 道追问清单)
前端·面试·ai编程
IT_陈寒3 小时前
Python的GIL把我坑惨了,多线程跑得比单线程还慢
前端·人工智能·后端
分支预测失败3 小时前
RISC-V 时间子系统深度专题:mtime 访问路径、SBI 定时器与 Linux tickless 协同
后端
65岁退休Coder3 小时前
PI Agent 开发一个生产级 Harness
后端·node.js·agent
用户8356290780513 小时前
如何使用 Python 给 Word 文档添加水印
后端·python