为你推荐
译者序
作者简介
前言
这本书是给谁看的
我们知道你在想什么
我们知道你的大脑在想什么
元认知:思考“何为思考”
我们是这样做的
说明
致谢
O’Reilly在线学习
1 让我们开始吧:语法基础
准备好,出发
Go Playground
这一切意味着什么
如果出了问题怎么办
调用函数
Println函数
使用其他包中的函数
函数返回值
Go程序模板
字符串
符文
布尔值
数字
数学运算与比较
类型
声明变量
零值
短变量声明
命名规则
转换
在你的计算机上安装Go
编译Go代码
Go工具
使用“go run”快速尝试代码
你的Go工具箱
2 接下来运行哪些代码:条件和循环
调用方法
评分
函数或方法的多个返回值
选项1:使用空白标识符忽略错误返回值
选项2:处理错误
条件
有条件地记录致命错误
避免遮盖名字
将字符串转换为数字
块
块和变量的作用域
我们已经完成了评分程序
短变量声明中只有一个变量必须是新的
让我们创建一个游戏
包名与导入路径
生成随机数
从键盘获取整数
将猜测与目标进行比较
循环
初始化和标志(post)语句是可选的
在我们的猜谜游戏中使用循环
中断我们的猜测循环
显示目标
恭喜你,游戏结束了
你的Go工具箱
3 调用:函数
一些重复的代码
使用Printf和Sprintf格式化输出
格式化动词
格式化值宽度
格式化小数宽度
在油漆计算器中使用Printf
声明函数
声明函数参数
在油漆计算器中使用函数
函数和变量的作用域
函数返回值
在油漆计算器中使用返回值
paintNeeded函数需要错误处理
错误值
声明多个返回值
在paintNeeded函数中使用多个返回值
始终处理错误
函数形参接收实参的副本
指针
指针类型
获取或更改指针的值
函数指针
使用指针修复我们的“double”函数
你的Go工具箱
4 代码集:包
不同的程序,相同的函数
使用包在程序之间共享代码
Go工作区目录保存包代码
创建一个新包
将包导入程序
包使用相同的文件布局
包命名规范
包限定符
将共享代码移动到包中
常量
嵌套的包目录和导入路径
使用“go install”安装程序可执行文件
使用GOPATH环境变量更改工作区
设置GOPATH
发布包
使用“go get”下载和安装包
使用“go doc”阅读包文档
使用doc注释记录包
在Web浏览器中查看文档
使用“godoc”提供HTML文档
“godoc”服务器包含你的包
你的Go工具箱
5 列表:数组
数组保存值的集合
数组中的零值
数组字面量
“fmt”包中的函数知道如何处理数组
在循环里访问数组元素
使用“len”函数检查数组长度
使用“for...range”安全遍历数组
在“for...range”循环中使用空白标识符
得到数组中数字之和
得到数组中数字的平均值
读取文本文件
将文本文件读入数组
更新我们的“average”程序来读取文本文件
我们的程序只能处理三个值
你的Go工具箱
6 追加的问题:切片
切片
切片字面量
切片运算符
底层数组
修改底层数组,修改切片
使用“append”函数在切片上添加数据
切片和零值
使用切片和“append”读取额外的文件行
尝试我们改进后的程序
出错时返回nil值切片
命令行参数
从os.Args切片获取命令行参数
切片运算符可用于其他切片
更新程序以使用命令行参数
可变长参数函数
使用可变长参数函数
使用可变长参数函数计算平均值
向可变长参数函数传递一个切片
切片拯救了我们
你的Go工具箱
7 标签数据:映射
计票
从文件中读取名字
使用困难的切片方法对名字计数
映射
映射字面量
映射中的零值
映射变量的零值是nil
如何区分已经赋值的值和零值
使用“delete”函数删除键/值对
使用映射来更新计票程序
对映射进行for...range循环
for...range循环以随机顺序处理映射
使用for...range循环来更新计票程序
计票程序完成
你的Go工具箱
8 构建存储:struct
切片和映射保存一种类型的值
struct是由多种类型的值构建的
使用点运算符访问struct字段
在struct中保存订阅者的数据
定义类型和struct
为杂志订阅者定义一个类型
与函数一起使用已定义类型
使用函数修改struct
通过指针访问struct的字段
使用指针传递大型struct
将struct类型移动到另一个包
定义类型的名称首字母必须大写才能导出该类型
struct字段的名称首字母必须大写才能导出该字段
struct字面量
创建一个Employee struct类型
创建一个Address struct类型
将struct作为字段增加到另一个类型中
在另一个struct中设置struct
匿名struct字段
嵌入struct
我们定义的类型完成了
你的Go工具箱
9 我喜欢的类型:定义类型
现实生活中的类型错误
具有底层基础类型的定义类型
定义类型和运算符
使用函数进行类型转换
使用方法修复函数名冲突
定义方法
接收器参数(几乎)就是另一个参数
方法(几乎)就像一个函数
指针类型的接收器参数
使用方法将Liters和Milliliters转换为Gallons
使用方法将Gallons转换为Liters和Milliliters
你的Go工具箱
10 保密:封装和嵌入
创建一个日期struct类型
人们将Date struct的字段设置为无效值
setter方法
setter方法需要指针接收器
添加其余的setter方法
在setter方法中添加校验
字段仍可以设置为无效值
将Date类型移到另外的包中
将Date字段设为未导出状态
通过导出的方法访问未导出的字段
getter方法
封装
在Event类型中嵌入Date类型
未导出的字段不会被提升
导出的方法像字段一样被提升
封装Event的Title字段
提升的方法与外部类型的方法共存
我们的calendar包完成了
你的Go工具箱
11 你能做什么:接口
具有相同方法的两种不同类型
只能接受一种类型的方法参数
接口
定义满足接口的类型
具体类型和接口类型
分配满足接口的任何类型
你只能调用接口中定义的方法
使用接口修复playList函数
类型断言
类型断言失败
当类型断言失败时避免异常
使用类型断言测试TapePlayer和TapeRecorder
“error”接口
Stringer接口
空接口
你的Go工具箱
12 重新站起来:从失败中恢复
从文件中读取数字,重新访问
任何错误都将阻止关闭文件
延迟函数调用
使用延迟函数调用从错误中恢复
使用延迟函数调用确保文件关闭
列出目录中的文件
列出子目录中的文件(会更棘手)
递归函数调用
递归地列出目录内容
递归函数中的错误处理
发起一个panic
堆栈跟踪
延迟调用在崩溃前完成
通过scanDirectory使用“panic”
何时产生panic
“recover”函数
panic值从recover中返回
从scanDirectory中的panic恢复
恢复panic
你的Go工具箱
13 分享工作:goroutine和channel
检索网页
多任务
使用goroutine的并发性
使用goroutine
在responseSize函数中使用goroutine
我们不能直接控制goroutine何时运行
go语句不能使用返回值
使用channel发送和接收值
同步goroutine与channel
观察goroutine同步
使用channel修复我们的网页大小程序
更新我们的channel以携带一个struct
你的Go工具箱
14 代码的质量保证:自动化测试
自动化测试比别人先发现bug
一个应该有自动化测试的函数
我们引入了一个bug
编写测试
使用“go test”命令运行测试
测试实际的返回值
使用“Errorf”方法获得更详细的测试失败消息
测试“helper”函数
让测试通过
测试驱动开发
另一个需要修复的bug
运行特定的测试集
表驱动测试
使用测试修复panic代码
你的Go工具箱
15 响应请求:Web应用程序
用Go编写Web应用程序
浏览器、请求、服务器和响应
一个简单的Web应用程序
你的计算机在自言自语
讲解一个简单的Web应用程序
资源路径
对不同的资源路径做出不同的响应
一级函数
将函数传递给其他函数
函数作为类型
接下来是什么
你的Go工具箱
16 要遵循的模式:HTML模板
留言簿应用程序
处理请求和检查错误的函数
设置一个项目目录并尝试应用程序
用HTML创建签名列表
使我们的应用程序以HTML响应
“text/template”包
使用带有模板的Execute方法的io.Writer接口
满足io.Writer的ResponseWriter和os.Stdout
使用action将数据插入模板
使用“if”action使模板的某些部分可选
使用“range”action来重复模板的某部分
使用action将struct字段插入模板
从文件中读入签名切片
保存签名和签名数的struct
更新模板以包含签名
允许用户使用HTML表单添加数据
表单提交请求
用于表单提交的Path和HTTP方法
从请求中获取表单字段的值
保存表单数据
HTTP重定向
我们完整的应用程序代码
你的Go工具箱
A 理解os.OpenFile:打开文件
理解os.OpenFile
将标志常量传递到os.OpenFile
二进制表示法
位运算符
按位与运算符
按位或运算符
对“os”包常量使用按位或运算
使用按位或运算修复os.OpenFile选项
Unix样式的文件权限
使用os.FileMode类型表示权限
八进制表示法
将八进制值转换为FileMode值
解释对os.OpenFile的调用
B 有六件事我们没有涉及:剩下的内容
#1 “if”的初始化语句
#2 switch语句
#3 更多基本类型
#4 更多关于符文的信息
#5 有缓冲的channel
#6 进一步阅读
索引
买过这本书的人还买过
读了这本书的人还在读
同类图书排行榜