引入

表示 truefalse,通常用于条件判断。布尔值是程序做决策的基础——ifforswitch 全靠它来控制走向。Go 的 bool 类型很纯粹,只有两个值,不能和整数互转,这让代码更清晰。

正文

定义

定义

bool 是 Go 的布尔类型,只有 truefalse 两个值。布尔值通过比较运算逻辑运算产生,用于控制程序的条件分支和循环。

语法

// 声明布尔值
var isActive bool = true
var isDeleted bool = false
 
// 比较运算产生布尔值
a := 10 > 5    // true
b := 10 == 5   // false
 
// 逻辑运算
c := true && false  // false
d := true || false  // true

例子

比较运算

比较运算的结果是 bool

a := 10
b := 20
 
fmt.Println(a == b)  // false
fmt.Println(a != b)  // true
fmt.Println(a > b)   // false
fmt.Println(a < b)   // true
fmt.Println(a >= b)  // false
fmt.Println(a <= b)  // true
运算符含义示例结果
==等于10 == 10true
!=不等于10 != 20true
>大于10 > 5true
<小于10 < 5false
>=大于等于10 >= 10true
<=小于等于10 <= 5false

逻辑运算

x := true
y := false
 
fmt.Println(x && y)  // false(与:两个都为 true 才是 true)
fmt.Println(x || y)  // true(或:有一个为 true 就是 true)
fmt.Println(!x)      // false(非:取反)
运算符含义说明
&&逻辑与两边都 truetrue
||逻辑或有一个 truetrue
!逻辑非取反

短路求值

// && 短路:左边 false,右边不执行
if false && expensiveFunc() {
    // expensiveFunc() 不会被调用
}
 
// || 短路:左边 true,右边不执行
if true || expensiveFunc() {
    // expensiveFunc() 不会被调用
}

短路求值是从左到右的,左边已经能确定结果,右边就不再执行。这个特性常用来做安全检查:

if ptr != nil && ptr.Value > 0 {
    fmt.Println("有效值")
}

先判断指针不为 nil,再访问它的值,避免空指针 panic。

条件判断中使用

age := 18
isAdult := age >= 18
 
if isAdult {
    fmt.Println("成年人")
} else {
    fmt.Println("未成年")
}
 
// 也可以直接在 if 里写比较表达式
if age >= 18 {
    fmt.Println("成年人")
}

布尔值不能和整数互转

// 以下全部编译报错
// var b bool = 1       // 错误
// var n int = true     // 错误
// if 1 { }             // 错误
 
// 必须显式判断
n := 1
if n != 0 {
    fmt.Println("非零")
}

Go 不允许把整数当布尔值用,这和 C/C++、Python、JavaScript 都不同。

布尔值零值

var b bool
fmt.Println(b)  // false

bool 的零值是 false

常见写法

写法说明
var b bool = true显式声明
b := a > 10比较运算得到布尔值
x && y逻辑与
x || y逻辑或
!x逻辑非
ptr != nil && ptr.X短路保护
if b { … }布尔值直接做条件

特点

  • bool 只有 truefalse没有其他值
  • 不能和整数互转0 不是 false1 不是 true
  • &&|| 支持短路求值,可以用来做安全检查
  • 零值是 false
  • 比较运算符 ==!=><>=<= 结果是 bool
  • if 条件必须bool 类型,不能放数字或指针

理解

Go 的布尔类型非常干净:只有 truefalse,不掺杂任何整数的概念。短路求值是写安全代码的利器——先检查指针非空,再访问它的字段,一行就搞定。Go 不允许 if 1 这种写法,虽然看起来严格,但确实能避免很多低级错误。

引出

布尔值和字符串里都提到了 UTF-8 编码和字符。那 Go 里单个字符到底是什么类型?接下来看 Go rune 和 byte,搞清楚 runebyte 的区别以及 Unicode 编码。