欢迎来到 AI 中文社区(简称 AI 中文社),这里是学习交流 AI 人工智能技术的中文社区。 为了更好的体验,本站推荐使用 Chrome 浏览器。
全部教程·
Go语言·
Go语言圣经
[目录]
·
3.4. 布尔型
Go语言圣经
0.1. Go语言起源
0.2. Go语言项目
0.3. 本书的组织
0.4. 更多的信息
0.5. 致谢
1. 入门
1.1. Hello, World
1.2. 命令行参数
1.3. 查找重复的行
1.4. GIF动画
1.5. 获取URL
1.6. 并发获取多个URL
1.7. Web服务
1.8. 本章要点
2. 程序结构
2.1. 命名
2.2. 声明
2.3. 变量
2.4. 赋值
2.5. 类型
2.6. 包和文件
2.7. 作用域
3. 基础数据类型
3.1. 整型
3.2. 浮点数
3.3. 复数
3.4. 布尔型
3.5. 字符串
3.6. 常量
4. 复合数据类型
4.1 数组
4.2 Slice
4.3 Map
4.4 结构体
4.5 JSON
4.6 文本和HTML模板
5. 函数
5.1. 函数声明
5.2. 递归
5.3. 多返回值
5.4. 错误
5.5. 函数值
5.6. 匿名函数
5.7. 可变参数
5.8. Deferred函数
5.9. Panic异常
5.10. Recover捕获异常
6. 方法
6.1. 方法声明
6.2. 基于指针对象的方法
6.3. 嵌入结构体扩展类型
6.4. 方法值和表达式
6.5. 示例: Bit数组
6.6. 封装
7. 接口
7.1. 接口是合约
7.2. 接口类型
7.3. 实现接口的条件
7.4. flag.Value接口
7.5. 接口值
7.6. sort.Interface接口
7.7. http.Handler接口
7.8. error接口
7.9. 示例: 表达式求值
7.10. 类型断言
7.11. 识别错误类型
7.12. 查询接口
7.13. 类型分支
7.14. XML解码
7.15. 补充几点
8. Go协程和通道
8.1. Goroutines
8.2. 并发的Clock服务
8.3. 并发的Echo服务
8.4. Channels
8.5. 并发的循环
8.6. 并发的Web爬虫
8.7. 多路复用
8.8. 并发的字典遍历
8.9. 并发的退出
8.10. 聊天服务
9. 并发
9.1. 竞争条件
9.2. sync.Mutex互斥锁
9.3. sync.RWMutex读写锁
9.4. 内存同步
9.5. sync.Once初始化
9.6. 竞争条件检测
9.7. 并发的非阻塞缓存
9.8. Goroutines和线程
10. 包和工具
10.1. 包简介
10.2. 导入路径
10.3. 包声明
10.4. 导入声明
10.5. 包的匿名导入
10.6. 包和命名
10.7. 工具
11. 测试
11.1. go test
11.2. 测试函数
11.3. 测试覆盖率
11.4. 基准测试
11.5. 剖析
11.6. 示例函数
12. 反射
12.1. 为何需要反射
12.2. reflect.Type
12.3. 递归打印
12.4. 编码S表达式
12.5. reflect.Value修改值
12.6. 解码S表达式
12.7. 获取结构体字段
12.8. 显示类型的方法集
12.9. 几点忠告
13. 底层编程
13.1. unsafe.Sizeof
13.2. unsafe.Pointer
13.3. 深度相等判断
13.4. cgo调用C代码
13.5. 几点忠告
Go语言圣经
0.1. Go语言起源
0.2. Go语言项目
0.3. 本书的组织
0.4. 更多的信息
0.5. 致谢
1. 入门
1.1. Hello, World
1.2. 命令行参数
1.3. 查找重复的行
1.4. GIF动画
1.5. 获取URL
1.6. 并发获取多个URL
1.7. Web服务
1.8. 本章要点
2. 程序结构
2.1. 命名
2.2. 声明
2.3. 变量
2.4. 赋值
2.5. 类型
2.6. 包和文件
2.7. 作用域
3. 基础数据类型
3.1. 整型
3.2. 浮点数
3.3. 复数
3.4. 布尔型
3.5. 字符串
3.6. 常量
4. 复合数据类型
4.1 数组
4.2 Slice
4.3 Map
4.4 结构体
4.5 JSON
4.6 文本和HTML模板
5. 函数
5.1. 函数声明
5.2. 递归
5.3. 多返回值
5.4. 错误
5.5. 函数值
5.6. 匿名函数
5.7. 可变参数
5.8. Deferred函数
5.9. Panic异常
5.10. Recover捕获异常
6. 方法
6.1. 方法声明
6.2. 基于指针对象的方法
6.3. 嵌入结构体扩展类型
6.4. 方法值和表达式
6.5. 示例: Bit数组
6.6. 封装
7. 接口
7.1. 接口是合约
7.2. 接口类型
7.3. 实现接口的条件
7.4. flag.Value接口
7.5. 接口值
7.6. sort.Interface接口
7.7. http.Handler接口
7.8. error接口
7.9. 示例: 表达式求值
7.10. 类型断言
7.11. 识别错误类型
7.12. 查询接口
7.13. 类型分支
7.14. XML解码
7.15. 补充几点
8. Go协程和通道
8.1. Goroutines
8.2. 并发的Clock服务
8.3. 并发的Echo服务
8.4. Channels
8.5. 并发的循环
8.6. 并发的Web爬虫
8.7. 多路复用
8.8. 并发的字典遍历
8.9. 并发的退出
8.10. 聊天服务
9. 并发
9.1. 竞争条件
9.2. sync.Mutex互斥锁
9.3. sync.RWMutex读写锁
9.4. 内存同步
9.5. sync.Once初始化
9.6. 竞争条件检测
9.7. 并发的非阻塞缓存
9.8. Goroutines和线程
10. 包和工具
10.1. 包简介
10.2. 导入路径
10.3. 包声明
10.4. 导入声明
10.5. 包的匿名导入
10.6. 包和命名
10.7. 工具
11. 测试
11.1. go test
11.2. 测试函数
11.3. 测试覆盖率
11.4. 基准测试
11.5. 剖析
11.6. 示例函数
12. 反射
12.1. 为何需要反射
12.2. reflect.Type
12.3. 递归打印
12.4. 编码S表达式
12.5. reflect.Value修改值
12.6. 解码S表达式
12.7. 获取结构体字段
12.8. 显示类型的方法集
12.9. 几点忠告
13. 底层编程
13.1. unsafe.Sizeof
13.2. unsafe.Pointer
13.3. 深度相等判断
13.4. cgo调用C代码
13.5. 几点忠告
3.4. 布尔型
一个布尔类型的值只有两种:true和false。if和for语句的条件部分都是布尔类型的值,并且==和<等比较操作也会产生布尔型的值。一元操作符!对应逻辑非操作,因此!true的值为false,更罗嗦的说法是(!true==false)==true,虽然表达方式不一样,不过我们一般会采用简洁的布尔表达式,就像用x来表示x==true。
布尔值可以和&&(AND)和||(OR)操作符结合,并且有短路行为:如果运算符左边值已经可以确定整个布尔表达式的值,那么运算符右边的值将不再被求值,因此下面的表达式总是安全的:
s != "" && s[0] == 'x'
其中s[0]操作如果应用于空字符串将会导致panic异常。
因为&&的优先级比||高(助记:&&对应逻辑乘法,||对应逻辑加法,乘法比加法优先级要高),下面形式的布尔表达式是不需要加小括弧的:
if 'a' <= c && c <= 'z' ||
'A' <= c && c <= 'Z' ||
'0' <= c && c <= '9' {
// ...ASCII letter or digit...
}
布尔值并不会隐式转换为数字值0或1,反之亦然。必须使用一个显式的if语句辅助转换:
i := 0
if b {
i = 1
}
如果需要经常做类似的转换, 包装成一个函数会更方便:
// btoi returns 1 if b is true and 0 if false.
func btoi(b bool) int {
if b {
return 1
}
return 0
}
数字到布尔型的逆转换则非常简单, 不过为了保持对称, 我们也可以包装一个函数:
// itob reports whether i is non-zero.
func itob(i int) bool { return i != 0 }
下一章:3.5. 字符串
一个字符串是一个不可改变的字节序列。字符串可以包含任意的数据,包括byte值0,但是通常是用来包含人类可读的文本。文本字符串通常被解释为采用UTF8编码的Unicode码点(rune)序列,我们稍后会详细讨论这个问题。&n ...
AI 中文社
