目录 (概要)
如何使用这本书:前言 xxvii
1 让我们开始吧:语法基础 1
2 接下来运行哪些代码:条件和循环 31
3 调用:函数 79
4 代码集:包 113
5 列表:数组 149
6 追加的问题:切片 175
7 标签数据:映射 205
8 构建存储:struct 231
9 我喜欢的类型:定义类型 265
10 保密:封装和嵌入 289
11 你能做什么:接口 321
12 重新站起来:从失败中恢复 349
13 分享工作:goroutine和 channel 379
14 代码的质量保证:自动化测试 401
15 响应请求:Web应用程序 425
16 要遵循的模式:HTML模板 445
A 理解os.OpenFile:打开文件 481
B 有六件事我们没有涉及:剩下的内容 495
目录 (真正的目录)
如何使用这本书
前言
你的大脑如何看待Go。在这里,你试图学习一些东西,而你的大脑 在帮你的忙,确保学习不会停滞不前。你的大脑在想:“最好给更重要的 事情留点儿空间,比如避开哪些野生动物,裸体滑雪是否是个坏主意。” 那么,你如何欺骗你的大脑,让它认为你的生活依赖于如何用Go编程呢?
这本书是给谁看的 xxviii
我们知道你在想什么 xxix
我们知道你的大脑在想什么 xxix
元认知:思考“何为思考” xxxi
我们是这样做的 xxxii
说明 xxxiv
致谢 xxxv
1让我们开始吧 语法基础
准备好给你的软件充电了吗?你想要一种编译速度快的简单编程语言吗?它跑 得快吗?它可以很容易地将你的工作分发给用户吗?那就准备好学习Go吧!
Go是一种注重简单性和速度的编程语言。它比其他语言都简单,所以学起来更快。它 可以让你利用当今多核计算机处理器的能力,使你的程序运行得更快。本章将向你展 示所有Go的功能,这些功能将使你作为开发人员的生活更轻松,并使你的用户更快乐。
准备好,出发 2
Go Playground 3
这一切意味着什么 4
如果出了问题怎么办 5
调用函数 7
Println函数 7
使用其他包中的函数 8
函数返回值 9
Go程序模板 11
字符串 11
符文 12
布尔值 12
数字 13
数学运算与比较 13
类型 14
声明变量 16
零值 17
短变量声明 19
命名规则 21
转换 22
在你的计算机上安装Go 25
编译Go代码 26
Go工具 27
使用“go run”快速尝试代码 27
你的Go 工具箱 28
package main import "fmt" func main() {
}
fmt.Println( )
"Hello, Go!"
Hello, Go!
1+ 2
true
3
4 <6
viii
'?'
1174 输出
2 接下来运行哪些代码
条件和循环
每个程序都有仅在特定情况下适用的部分。“如果出现错误,应该运行 这段代码。否则,应该运行其他代码。”几乎每个程序都包含只有在特定条件为真时才 应该运行的代码。因此,几乎每种编程语言都提供条件语句,让你决定是否运行某段代 码。Go也不例外。
你可能还需要重复运行代码中的某些部分。与大多数语言一样,Go提供了循环, 可以多次运行某部分代码。在本章中,我们将学习使用条件句和循环!
调用方法 32
评分 34
函数或方法的多个返回值 36
选项1:使用空白标识符忽略错误返回值 37
选项2:处理错误 38
条件 39
有条件地记录致命错误 42
避免遮盖名字 44
将字符串转换为数字 46
块 49
块和变量的作用域 50
我们已经完成了评分程序 52
短变量声明中只有一个变量必须是新的 54
让我们创建一个游戏 55
包名与导入路径 56
生成随机数 57
从键盘获取整数 59
将猜测与目标进行比较 60
循环 61
初始化和标志(post)语句是可选的 63
在我们的猜谜游戏中使用循环 66
中断我们的猜测循环 69
显示目标 70
恭喜你,游戏结束了 72
你的Go工具箱 74
条件语句块 结束
条件语句块 开始
条件语句块主体
“if”关键字
条件
if 1< 2 {
fmt.Println("It's true!")
}
3 调用
函数
你错过了机会。你一直像专业人士一样调用函数。但你唯一能调用的函数是 Go为你定义的函数。现在,轮到你了。我们将向你展示如何创建你自己的函数。 我们将学习如何声明带参数和不带参数的函数。我们将声明返回单个值的函数, 并且我们将学习如何返回多个值,以便我们可以指示何时发生了错误。我们还将 学习指针,它允许我们进行更有效的内存函数的调用。
一些重复的代码 80
使用Printf和Sprintf格式化输出 81
格式化动词 82
格式化值宽度 83
格式化小数宽度 84
在油漆计算器中使用Printf 85
声明函数 86
声明函数参数 87
在油漆计算器中使用函数 88
函数和变量的作用域 90
函数返回值 91
在油漆计算器中使用返回值 93
paintNeeded函数需要错误处理 95
错误值 96
声明多个返回值 97
在paintNeeded函数中使用多个返回值 98
始终处理错误 99
函数形参接收实参的副本 102
指针 103
指针类型 104
获取或更改指针的值 105
函数指针 107
使用指针修复我们的“double”函数 108
你的Go工具箱 110
4 代码集
包
是时候整理一下了。到目前为止,我们一直将所有代码放在一个文件中。 随着我们的程序变得越来越大、越来越复杂,这很快就会变得一团糟。
在本章中,我们将向你展示如何创建自己的包,以帮助将相关代码集中放在 一个地方。但是包不仅仅对组织结构有益,它还是在程序之间共享代码的一种简单方法,同时也是与其他开发人员共享代码的一种简单方法。
不同的程序,相同的函数 114
使用包在程序之间共享代码 116
Go工作区目录保存包代码 117
创建一个新包 118
将包导入程序 119
包使用相同的文件布局 120
包命名规范 123
包限定符 123
将共享代码移动到包中 124
常量 126
嵌套的包目录和导入路径 128
使用“go install”安装程序可执行文件 130
使用GOPATH环境变量更改工作区 131
设置GOPATH 132
发布包 133
使用“go get”下载和安装包 137
使用“go doc”阅读包文档 139
使用doc注释记录包 141
在Web浏览器中查看文档 143
使用“godoc”提供HTML文档 144
“godoc”服务器包含你的包 145
你的Go工具箱 146
go
bin
hi pkg
src
greeting
greeting.go hi
main.go
5 列表
数组
很多程序都处理列表。地址列表、电话号码列表、产品列表。Go有两种内置 的存储列表的方法。本章将介绍第一种:数组。你将了解如何创建数组,如何用数 据填充数组,以及如何重新获取这些数据。然后你将学习如何处理数组中的所有元 素,首先是使用for循环的困难些的方法,然后是使用for...range循环的简单 些的方法。
数组保存值的集合 150
数组中的零值 152
数组字面量 153
“fmt”包中的函数知道如何处理数组 154
在循环里访问数组元素 155
使用“len”函数检查数组长度 156
使用“for ... range”安全遍历数组 157
在“for ... range”循环中使用空白标识符 158
得到数组中数字之和 159
得到数组中数字的平均值 161
读取文本文件 163
将文本文件读入数组 166
更新我们的“average”程序来读取文本文件 168
我们的程序只能处理三个值 170
你的Go工具箱 172
数组中将要存储的元素类型
数组中将要存储的元素个数
var myArray [4]string
索引0
索引1
索引2
索引3
6 追加的问题
切片
我们已经知道了无法将更多的元素增加到一个数组中。对于程序的确是个问题。因为我们无法提前知道文件中包含多少个块。而这就是Go中的切片 (slice)的用武之地。切片是一个可以通过增长来保存额外数据的集合类型,正好能够满足程序的需要!我们将看到切片是如何让用户以简洁的方式在程序中提供 数据的,以及如何帮助你写出更加方便调用的函数。
切片 176
切片字面量 177
切片运算符 180
底层数组 182
修改底层数组,修改切片 183
使用“append”函数在切片上添加数据 184
切片和零值 186
使用切片和“append”读取额外的文件行 187
尝试我们改进后的程序 189
出错时返回nil值切片 190
命令行参数 191
从os.Args切片获取命令行参数 192
切片运算符可用于其他切片 193
更新程序以使用命令行参数 194
可变长参数函数 195
使用可变长参数函数 197
使用可变长参数函数计算平均值 198
向可变长参数函数传递一个切片 199
切片拯救了我们 201
你的Go工具箱 202
切片
底层数组
数组1
切片1
{"a", "b", "c", "d", "e"}
7 标签数据
映射
堆积物品是个好方法,直到你需要再次找到它。你已经看到了如何使用 切片和数组来创建一列数据。但是当你需要使用一个特定的值时会怎样?为了找 到它,你需要从数组或者切片的开头开始,查看每一个元素。
如果有一种集合,其中的每个值都有个标签在上面,那么你就可以快速找到你需 要的值!在这一章,我们来看映射,它就是做这个的。
计票 206
从文件中读取名字 207
使用困难的切片方法对名字计数 209
映射 212
映射字面量 214
映射中的零值 215
映射变量的零值是nil 215
如何区分已经赋值的值和零值 216
使用“delete”函数删除键/值对 218
使用映射来更新计票程序 219
对映射进行for ... range循环 221
for ... range循环以随机顺序处理映射 223
使用for ... range循环来更新计票程序 224
计票程序完成 225
你的Go工具箱 227
Carlos Diaz
Amber Graham Brian Martin
Mikey Moose
键可以使你快速 找到数据!
8 构建存储
struct
有时你需要保存超过一种类型的数据。我们学习了切片,它能够保存 一组数据。然后学习了映射,它能保存一组键和一组值。这两种数据结构都只 能保存一种类型。有时,你需要一组不同类型的数据,例如邮件地址,混合了 街道名(字符串类型)和邮政编码(整型);又如学生记录,混合保存学生名 字和成绩(浮点数)。你无法用切片或者映射来保存。但是你可以使用其他的名为struct的类型来保存。本章会介绍struct的所有信息!
切片和映射保存一种类型的值 232
struct是由多种类型的值构建的 233
使用点运算符访问struct字段 234
在struct中保存订阅者的数据 235
定义类型和struct 236
为杂志订阅者定义一个类型 238
与函数一起使用已定义类型 239
使用函数修改struct 242
通过指针访问struct的字段 244
使用指针传递大型struct 246
将struct类型移动到另一个包 248
定义类型的名称首字母必须大写才能导出该类型 249
struct字段的