Go Web 编程
谢孟军
2013 年 10 月 3 日
目录
第一章 GO 环境配置 1
§1.1 Go 安装 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1.1 Go 的三种安装方式 . . . . . . . . . . . . . . . . . . . 1
1.1.2 Go 源码安装 . . . . . . . . . . . . . . . . . . . . . . . 2
1.1.3 Go 标准包安装 . . . . . . . . . . . . . . . . . . . . . . 3
1.1.4 第三方工具安装 . . . . . . . . . . . . . . . . . . . . . . 7
§1.2 GOPATH 与工作空间 . . . . . . . . . . . . . . . . . . . . . . 8
1.2.1 GOPATH 设置 . . . . . . . . . . . . . . . . . . . . . . 8
1.2.2 应用目录结构 . . . . . . . . . . . . . . . . . . . . . . . 8
1.2.3 编译应用 . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.2.4 获取远程包 . . . . . . . . . . . . . . . . . . . . . . . . 10
1.2.5 程序的整体结构 . . . . . . . . . . . . . . . . . . . . . . 11
§1.3 Go 命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.3.1 go build . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.3.2 go clean . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.3.3 go fmt . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.3.4 go get . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.3.5 go install . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.3.6 go test . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.3.7 go doc . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.3.8 其它命令 . . . . . . . . . . . . . . . . . . . . . . . . . 16
第 ii 页 目录 Go Web 编程
§1.4 Go 开发工具 . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.4.1 LiteIDE . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.4.2 Sublime Text . . . . . . . . . . . . . . . . . . . . . . . 20
1.4.3 Vim . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.4.4 Emacs . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
1.4.5 Eclipse . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
1.4.6 IntelliJ IDEA . . . . . . . . . . . . . . . . . . . . . . . 32
§1.5 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
第二章 Go 语言基础 38
§2.1 你好,Go . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
2.1.1 程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
2.1.2 详解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
2.1.3 结论 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
§2.2 Go 基础 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
2.2.1 定义变量 . . . . . . . . . . . . . . . . . . . . . . . . . 40
2.2.2 常量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
2.2.3 内置基础类型 . . . . . . . . . . . . . . . . . . . . . . . 42
2.2.4 一些技巧 . . . . . . . . . . . . . . . . . . . . . . . . . 45
2.2.5 array、slice、map . . . . . . . . . . . . . . . . . . . . 48
§2.3 流程和函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
2.3.1 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
§2.4 struct 类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
2.4.1 struct . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
§2.5 面向对象 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Go Web 编程 目录 第 iii 页
2.5.1 method . . . . . . . . . . . . . . . . . . . . . . . . . . 80
§2.6 interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
2.6.1 interface . . . . . . . . . . . . . . . . . . . . . . . . . . 90
§2.7 并发 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
2.7.1 goroutine . . . . . . . . . . . . . . . . . . . . . . . . . 103
2.7.2 channels . . . . . . . . . . . . . . . . . . . . . . . . . . 105
2.7.3 Buffered Channels . . . . . . . . . . . . . . . . . . . . 106
2.7.4 Range 和 Close . . . . . . . . . . . . . . . . . . . . . . 107
2.7.5 Select . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
2.7.6 超时 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
2.7.7 runtime goroutine . . . . . . . . . . . . . . . . . . . . 110
§2.8 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
第三章 Web 基础 112
§3.1 Web 工作方式 . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
3.1.1 URL 和 DNS 解析 . . . . . . . . . . . . . . . . . . . . 114
3.1.2 HTTP 协议详解 . . . . . . . . . . . . . . . . . . . . . 118
3.1.3 请求实例 . . . . . . . . . . . . . . . . . . . . . . . . . 122
§3.2 GO 搭建一个 web 服务器 . . . . . . . . . . . . . . . . . . . . 123
3.2.1 http 包建立 web 服务器 . . . . . . . . . . . . . . . . . 123
§3.3 Go 如何使得 Web 工作 . . . . . . . . . . . . . . . . . . . . . 126
3.3.1 web 工作方式的几个概念 . . . . . . . . . . . . . . . . 126
3.3.2 分析 http 包运行机制 . . . . . . . . . . . . . . . . . . 127
§3.4 Go 的 http 包详解 . . . . . . . . . . . . . . . . . . . . . . . . 129
3.4.1 Conn 的 goroutine . . . . . . . . . . . . . . . . . . . . 131
3.4.2 ServeMux 的自定义 . . . . . . . . . . . . . . . . . . . 131
3.4.3 Go 代码的执行流程 . . . . . . . . . . . . . . . . . . . 135
§3.5 小结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
第 iv 页 目录 Go Web 编程
第四章 表单 137
§4.1 处理表单的输入 . . . . . . . . . . . . . . . . . . . . . . . . . . 137
§4.2 验证表单的输入 . . . . . . . . . . . . . . . . . . . . . . . . . . 141
4.2.1 必填字段 . . . . . . . . . . . . . . . . . . . . . . . . . 141
4.2.2 数字 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
4.2.3 中文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
4.2.4 英文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
4.2.5 电子邮件地址 . . . . . . . . . . . . . . . . . . . . . . . 143
4.2.6 手机号码 . . . . . . . . . . . . . . . . . . . . . . . . . 143
4.2.7 下拉菜单 . . . . . . . . . . . . . . . . . . . . . . . . . 144
4.2.8 单选按钮 . . . . . . . . . . . . . . . . . . . . . . . . . 144
4.2.9 复选框 . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
4.2.10 日期和时间 . . . . . . . . . . . . . . . . . . . . . . . . 146
4.2.11 身份证号码 . . . . . . . . . . . . . . . . . . . . . . . . 146
§4.3 预防跨站脚本 . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
§4.4 防止多次递交表单 . . . . . . . . . . . . . . . . . . . . . . . . 149
§4.5 处理文件上传 . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
4.5.1 客户端上传文件 . . . . . . . . . . . . . . . . . . . . . . 154
§4.6 小结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
第五章 访问数据库 157
§5.1 database/sql 接口 . . . . . . . . . . . . . . . . . . . . . . . . 157
5.1.1 sql.Register . . . . . . . . . . . . . . . . . . . . . . . . 157
5.1.2 driver.Driver . . . . . . . . . . . . . . . . . . . . . . . 159
5.1.3 driver.Conn . . . . . . . . . . . . . . . . . . . . . . . . 159