Bool 类型 - Boolean Types

← 返回数据类型

布尔类型表示真或假的二元值。

Bool 基础

声明布尔变量

// 声明布尔变量
var isActive bool = true
var isVerified bool = false

// 类型推断
enabled := true
disabled := false

// 零值为 false
var defaultValue bool  // false

Bool 零值

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

重要 Bool 的零值是 false,不是 nil

Bool 运算

逻辑运算符

a := true
b := false

// 逻辑非(NOT)
fmt.Println(!a)  // false

// 逻辑与(AND)
fmt.Println(a && b)  // false

// 逻辑或(OR)
fmt.Println(a || b)  // true

运算符优先级

// 优先级:! > && > ||
result := true || false && false  // true(先算 &&)
fmt.Println(result)

// 建议使用括号明确优先级
result = true || (false && false)  // 更清晰

比较运算返回 Bool

// 比较运算返回 bool 值
fmt.Println(10 > 5)    // true
fmt.Println(5 == 5)    // true
fmt.Println(3 != 3)    // false
fmt.Println(7 >= 7)    // true

Bool 使用场景

状态标志

type User struct {
    IsActive    bool
    IsVerified  bool
    HasPermission bool
}

user := User{
    IsActive:    true,
    IsVerified:  false,
    HasPermission: true,
}

// 条件检查
if user.IsActive && user.IsVerified {
    fmt.Println("用户已激活且已验证")
}

配置开关

type Config struct {
    Debug      bool
    Logging    bool
    CacheEnabled bool
}

config := Config{
    Debug:      true,
    Logging:    false,
    CacheEnabled: true,
}

if config.Debug {
    fmt.Println("Debug 模式已开启")
}

函数返回 Bool

// 判断是否为偶数
func isEven(n int) bool {
    return n%2 == 0
}

// 验证邮箱格式
func isValidEmail(email string) bool {
    return strings.Contains(email, "@")
}

// 检查权限
func hasPermission(user User, resource string) bool {
    return user.IsActive && user.HasPermission
}

if isEven(10) {
    fmt.Println("10 是偶数")
}

Bool 与控制流

if 语句

isActive := true

// 简洁形式
if isActive {
    fmt.Println("激活状态")
}

// 带否定的形式
if !isActive {
    fmt.Println("未激活")
}

// 多条件
if isActive && isVerified {
    fmt.Println("激活且已验证")
}

三元表达式的替代

Go 没有三元运算符,使用 if-else:

// ❌ Go 没有三元运算符
// result := condition ? value1 : value2

// ✅ 使用 if-else
var result string
if condition {
    result = value1
} else {
    result = value2
}

Bool 最佳实践

命名建议

// ✅ 好:使用 is/has/can 前缀
var isActive bool
var hasPermission bool
var canWrite bool
var shouldRetry bool

// ❌ 差:命名不清晰
var active bool
var permission bool

避免 Bool 参数

// ❌ 差:多个 bool 参数难以理解
func process(enabled, verbose, debug bool) {
    // enabled 是什么?verbose 影响什么?
}

// ✅ 好:使用选项模式
type Options struct {
    Enabled bool
    Verbose bool
    Debug   bool
}

func process(opts Options) {
    if opts.Enabled && opts.Verbose {
        // ...
    }
}

// 调用更清晰
process(Options{
    Enabled: true,
    Verbose: true,
    Debug:   false,
})

返回 Bool 时提供原因

// ❌ 差:只知道失败,不知道原因
func isValid(data string) bool {
    return len(data) > 0
}

// ✅ 好:返回 bool 和错误信息
func validate(data string) (bool, error) {
    if len(data) == 0 {
        return false, errors.New("data cannot be empty")
    }
    return true, nil
}

if valid, err := validate(data); !valid {
    fmt.Println("验证失败:", err)
}

Bool 陷阱

陷阱1:将非布尔值当作 Bool

// ❌ Go 不允许非布尔值在条件中
// if 1 {  // 编译错误
//     fmt.Println("true")
// }

// ✅ 必须使用布尔表达式
if 1 > 0 {
    fmt.Println("true")
}

// ❌ 不能将整数转换为 bool
// n := 1
// if n {  // 编译错误
// }

// ✅ 需要显式比较
if n != 0 {
    fmt.Println("非零")
}

陷阱2:nil 与 false 的区别

type Result struct {
    Success bool
}

var r *Result  // nil 指针

// 检查指针是否为 nil
if r == nil {
    fmt.Println("结果不存在")
}

// 检查 bool 字段(需要先检查指针)
if r != nil && r.Success {
    fmt.Println("操作成功")
}

陷阱3:Bool 指针

// 使用 bool 指针表示"三种状态"
type User struct {
    IsDeleted *bool  // nil=未设置, true=已删除, false=未删除
}

// 通常更好的做法是使用枚举
type DeleteStatus int

const (
    DeleteStatusUnknown DeleteStatus = iota
    DeleteStatusActive
    DeleteStatusDeleted
)

type User struct {
    DeleteStatus DeleteStatus
}

Bool 与接口

实现条件接口

// 定义条件接口
type Condition interface {
    Evaluate() bool
}

// 具体条件
type AgeCondition struct {
    MinAge int
}

func (c AgeCondition) Evaluate() bool {
    return time.Now().Year() - c.BirthYear >= c.MinAge
}

// 使用
conditions := []Condition{
    AgeCondition{MinAge: 18},
    // ...
}

for _, cond := range conditions {
    if cond.Evaluate() {
        fmt.Println("条件满足")
    }
}

Bool 速查表

操作语法结果
声明var b bool零值 false
字面量true, false布尔值
逻辑非!b取反
逻辑与a && b两真为真
逻辑或a || b有真即真
比较a == b相等判断

练习

  1. 编写函数判断字符串是否为回文(返回 bool)
  2. 实现配置结构体,使用 bool 字段控制功能开关
  3. 创建用户验证系统,使用多个 bool 字段表示不同状态

← 数值类型 | String →