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 类型系统的重要一步。

相关推荐
程序员爱钓鱼1 小时前
Rust Clone详解:深拷贝、复制成本与正确使用方式
后端·面试·rust
程序员-Benothing1 小时前
MySQL 的存储引擎有哪些?它们之间有什么区别?
后端·mysql·面试·职场和发展
卷无止境1 小时前
当Python遇上并发:concurrent.futures的核心逻辑与实战技巧
后端·python
卷无止境2 小时前
编程语言里到底有没有经济学规律?
后端·python
唐青枫2 小时前
别让数据库靠手改:Go golang-migrate 从版本脚本到生产发布详解
go
郑州光合科技余经理8 小时前
代驾系统架构拆解:订单链路、权限组织与私有化源码交付
开发语言·后端·算法·架构·系统架构·uni-app·php
hboot10 小时前
AI工程师第六课 - RAG检索增强生成
后端·langchain·llm
天才测试猿11 小时前
2026软件测试面试八股文(含答案+文档)
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展