Go Web编程
2013-6
电子工业出版社
谢孟军
无
缘起自从一年半之前看到许式伟的博客,我认识了Go这一门语言,发现Go是C系的,个人又偏爱C语言,所以就开始了Go语言的学习之路,用三天时间学习了Go语言的所有语法和基础知识。恰逢当时手上有一些小项目练手,在项目开发中进一步发现Go语言具有三大优点:第一,性能好,我的Mac能够跑2万左右的并发;第二,语法简单,对于以前有C语言基础的人来说非常容易上手,我仅用一天时间就熟悉了基本语法,Go语言是一个上手即用的语言;第三,开发效率高,目前有很多编辑器支持Go语言,对于开发效率有很大的提升,一般的小项目半天就能解决。通过一年多来对Go语言项目的实战累积,我越来越觉得Go是一门工程语言,而不是其他学院派。无论是开发、测试、部署、项目规模的扩展,或者是团队协作,Go语言考虑都非常周到;而且其语法恰当好处,不多不少,够用就是它的设计原则,所以Go语言非常适合项目的开发。选择Go语言,还有一部分是缘于我的个人崇拜,Go语言的作者不乏鼎鼎大名的牛人:Robert Griesemer、Rob Pike和Ken Thompson,他们曾设计C语言和Unix系统,后来隶属Plan9团队。重要的是,在Go语言的完全开源中,很多名人都参与了进来,使得这个项目越来越完善:Go1.1出来后,性能提升了30-50%,而且GC(垃圾回收机制)已经达到了非常高的水准。相信在开源社区和大牛的共同推动下,Go语言会茁壮成长。Go Web我以前是PHP开发者,有十年左右的Web开发经验,但在Go语言的显著优势下,逐渐走向了Go语言的开发之路。我发现Go语言虽然有很强大的网络编程库,但是在Web编程方面没有详细的介绍,也缺少一些比较实用的库,所以结合先前的Web开发经验,以及Go语言本身的网络编程库,开始了这本书的创作过程,希望更多同行能够加入到Go语言的开发行列。这本书主要分三部分,第一部分是Go语言的基础语法,主要介绍了Go语言的一些语法特性、环境配置和开发工具。第二部分是Web开发,主要介绍了Go Web的基本原理、表单处理、数据库操作、Session和Cookie处理、文本处理、Socket编程、安全加密、国际化和本地化、错误处理和调试、如何部署和维护等知识点,并且针对整个Web开发中需要用到的知识点,结合Go语言代码的原理进行了详细的介绍,针对Go语言在Web开发方面不存在的工具,提供了详细的实现方式。第三部分是应用框架beego,主要介绍了beego框架的设计、实现及应用。目前书中提到的一些功能都可以在我的github找到相应的代码,方便读者进行深入的研究。这是一本关于Web的书,我觉得特别适合以下几种开发者:如果你是PHP或者其他动态语言爱好者,Go语言不一定能带给你很大的惊喜,因为原来的速度不是根本问题。但如果是类似API应用方面,使用Go语言之后,你会发现性能得到了一个量的提升,这本书中就有详细介绍API开发的实例。如果你是C语言爱好者,强烈建议你学习和使用Go语言。Go语言称为21世纪的C语言,它不仅可以调用C语言程序,又可以提供足够的便利;虽然速度上稍有牺牲,但无关大雅。大部分场景下,Go语言都能带给你与C语言媲美的性能,对于某些确实性能关键的场合,我们也可以通过cgo,让Go语言和C语言搭配使用。如果你是Java爱好者,那么也建议你学习一下Go语言,因为Java能给你的,Go语言能给得更好。如果你是C++爱好者,那么赶紧来看看Go语言吧,因为光学习C++特性的时间,已经可以开发多个Go语言项目了。致谢Go社区里的同仁们给了我很大的支持,如果没有他们的反馈和帮助,我就不能顺利完成本书。非常感谢四月份平民、Hong Ruiqi、BianJiang、Oling Cat、Wenlei Wu、polaris、雨痕等网友的热心指导,还有很多github中的贡献者,本书是在大家共同协作努力下才得以完成。我还要感谢符隆美编辑对我的支持,当我才思枯竭、延期脱稿时,她经常鼓励我、开导我,使我在压力下完成此书并最终出版。最后要感谢家庭对我的莫大支持,妻子刘玉娟帮我收集资料,帮忙完成了本书的大部分整理工作,儿子们倾听我的思路想法,没有他们,我也没有毅力完成写作,谢谢他们。谢孟军2013年4月于上海
《Go Web编程》介绍如何使用Go语言编写Web,包含了Go语言的入门、Web相关的一些知识、Go中如何处理Web的各方面设计(表单、session、cookie等)、数据库以及如何编写GoWeb应用等相关知识。通过《Go Web编程》的学习能够让读者了解Go的运行机制,如何用Go编写Web应用,以及Go的应用程序的部署和维护等,让读者对整个的Go的开发了如指掌。
谢孟军,网名ASTA谢,现就职于盛大云,高级研究员,技术经理,主要从事盛大云分发的系统研发工作,努力为盛大游戏、盛大文学、酷六等提供更好的CDN服务。热爱技术,尤其关注实现服务器端高性能、高可用等相关技术。开发了beego、beedb等各类基于Go语言的开源框架和库,致力于Go语言的推广和研究。
第1章GO语言环境配置1 1.1Go语言安装1 Go语言的三种安装方式1 Go语言源码安装2 Go语言标准包安装2 第三方工具安装5 1.2GOPATH与工作空间5 GOPATH设置5 应用目录结构6 编译应用7 获取远程包8 程序的整体结构8 1.3Go语言命令9 Go语言命令9 gobuild10 goclean10 gofmt11 goget11 goinstall12 gotest12 godoc12 其他命令12 1.4Go语言开发工具13 LiteIDE13 SublimeText16 Vim19 Emacs20 Eclipse23 IntelliJIDEA26 1.5总结29 第2章Go语言基础30 2.1你好,Go30 程序30 详解31 小结31 2.2Go语言基础32 定义变量32 常量33 内置基础类型33 一些技巧36 array、slice、map37 2.3流程和函数44 流程控制44 函数48 2.4struct类型57 struct57 2.5面向对象62 method62 2.6interface70 interface70 2.7并发80 goroutine80 channels81 BufferedChannels82 Range和Close83 Select84 超时85 runtimegoroutine85 2.8总结85 第3章Web基础87 3.1Web工作方式87 URL和DNS解析88 HTTP协议详解90 请求实例95 3.2GO语言搭建一个Web服务器95 http包建立Web服务器96 3.3Go语言如何使Web工作97 Web工作方式的几个概念97 分析http包运行机制98 3.4Go语言的http包详解100 Conn的goroutine100 ServeMux的自定义100 Go语言代码的执行流程102 3.5总结103 第4章表单104 4.1处理表单的输入104 4.2验证表单的输入107 必填字段107 数字108 中文108 英文109 电子邮件地址109 手机号码109 下拉菜单109 单选按钮110 复选框110 日期和时间111 身份证号码111 4.3预防跨站脚本112 4.4防止多次递交表单113 4.5处理文件上传115 客户端上传文件117 4.6总结119 第5章访问数据库120 5.1database/sql接口120 sql.Register120 driver.Driver121 driver.Conn122 driver.Stmt122 driver.Tx123 driver.Execer123 driver.Result123 driver.Rows123 driver.RowsAffected124 driver.Value124 driver.ValueConverter124 driver.Valuer125 database/sql125 5.2使用MySQL数据库125 MySQL驱动126 示例代码126 5.3使用SQLite数据库129 驱动129 实例代码129 5.4使用PostgreSQL数据库131 驱动131 实例代码132 5.5使用beedb库进行ORM开发134 安装134 如何初始化135 插入数据136 更新数据136 查询数据137 删除数据138 关联查询138 GroupBy和Having139 进一步的发展139 5.6NOSQL数据库操作139 redis140 MongoDB141 5.7总结143 第6章Session和数据存储144 6.1Session和Cookie144 Cookie146 Session147 小结148 6.2Go语言如何使用Session148 Session创建过程149 Go语言实现Session管理149 6.3Session存储154 6.4预防Session劫持157 Session劫持过程157 Session劫持防范160 6.5总结161 第7章文本处理162 7.1XML处理162 解析XML163 输出XML165 7.2JSON处理168 解析JSON168 生成JSON171 7.3正则处理173 通过正则判断是否匹配174 通过正则获取内容175 7.4模板处理179 什么是模板179 Go语言模板使用180 模板中如何插入数据180 Must操作186 嵌套模板186 小结188 7.5文件操作188 目录操作188 文件操作189 7.6字符串处理191 字符串操作191 字符串转换193 7.7总结194 第8章Web服务195 8.1Socket编程195 什么是Socket196 Socket如何通信196 Socket基础知识197 TCPSocket198 UDPSocket202 小结204 8.2WebSocket204 WebSocket原理205 Go语言实现WebSocket206 8.3REST209 什么是REST209 RESTful的实现211 小结213 8.4RPC213 RPC工作原理214 GoRPC215 小结223 8.5总结223 第9章安全与加密224 9.1预防CSRF攻击224 什么是CSRF224 CSRF的原理225 如何预防CSRF226 总结227 9.2确保输入过滤228 识别数据228 过滤数据228 区分过滤数据229 小结230 9.3避免XSS攻击230 什么是XSS230 XSS的原理231 如何预防XSS232 小结232 9.4避免SQL注入232 什么是SQL注入232 SQL注入实例233 如何预防SQL注入234 小结234 9.5存储密码235 普通方案235 进阶方案236 专家方案237 总结237 9.6加密和解密数据237 base64加解密238 高级加解密238 小结240 9.7总结240 第10章国际化和本地化241 10.1设置默认地区241 什么是Locale241 设置Locale242 小结244 10.2本地化资源244 本地化文本信息244 本地化日期和时间246 本地化货币值246 本地化视图和资源247 小结248 10.3国际化站点248 管理多个本地包248 自动加载本地包249 templatemapfunc250 小结252 10.4总结252 第11章错误处理,调试和测试253 11.1错误处理253 Error类型254 自定义error255 错误处理256 小结258 11.2使用GDB调试258 GDB调试简介259 常用命令259 调试过程261 小结264 11.3Go语言怎么写测试用例264 如何编写测试用例265 如何编写压力测试267 小结268 11.4总结268 第12章部署与维护269 12.1应用日志269 seelog介绍269 基于seelog的自定义日志处理270 发生错误发送邮件272 使用应用日志273 小结273 12.2网站错误处理273 错误处理的目标274 如何处理错误275 如何处理异常277 小结277 12.3应用部署278 daemon278 Supervisord280 小结282 12.4备份和恢复283 应用备份283 MySQL备份284 MySQL恢复287 redis备份287 redis恢复287 小结287 12.5总结287 第13章如何设计一个Web框架289 13.1项目规划289 gopath以及项目设置289 应用程序流程图290 目录结构291 框架设计291 总结291 13.2自定义路由器设计292 HTTP路由292 默认的路由实现292 beego框架路由实现293 13.4日志和配置设计298 日志和配置的重要性298 beego的日志设计298 beego的配置设计301 应用指南303 13.5实现博客的增删改303 博客目录304 博客路由304 数据库结构304 控制器305 model层306 view层307 13.6总结309 第14章扩展Web框架310 14.1静态文件支持310 beego静态文件实现和设置310 Bootstrap集成311 14.2Session支持312 Session集成312 Session使用314 14.3表单及验证支持315 表单和验证315 表单类型316 表单验证316 14.4用户认证318 HTTPBasic和HTTPDigest认证318 oauth和oauth2的认证319 自定义认证321 14.5多语言支持324 i18n集成324 多语言开发使用325 14.6pprof支持326 beego支持pprof326 使用入门327 14.7小结329 附录A参考资料330
版权页: 插图: 过滤用户数据是Web应用安全的基础,是验证数据合法性的过程。通过对所有的输入数据进行过滤,可以避免恶意数据在程序中被误信或误用。大多数Web应用的漏洞都是因为没有对用户输入的数据进行恰当过滤所引起。 我们介绍的过滤数据分成三个步骤。 1.识别数据,搞清楚需要过滤的数据来自于哪里。 2.过滤数据,弄明白我们需要什么样的数据。 3.区分己过滤及被污染数据,如果存在攻击数据,保证过滤之后可以让我们使用更安全的数据。 识别数据 “识别数据”作为第一步是因为在你不知道“数据是什么,它来自于哪里”的前提下,你也就不能正确地过滤它。这里的数据是指所有源自非代码内部提供的数据。例如,所有来自客户端的数据,但客户端并不是唯一的外部数据源,数据库和第三方提供的接口数据等也可以是外部数据源。 我们通过G0语言非常容易识别由用户输入的数据,G0语言通过r.ParseForm之后,把用户POST和GET的数据全部放在了r.Form里面。其他的输入更难识别,例如,r.Header中的很多元素是由客户端所操纵的。常常很难确认其中的哪些元素组成了输入,所以,最好的方法是把里面所有的数据都看成是用户输入(例如r.Header.Get(”Accept—Charset”)这也看做是用户输入,虽然这些大多数是浏览器操纵的)。 过滤数据 知道数据来源之后,就可以过滤它了。过滤是一个有点正式的术语,它在平时表述中有很多同义词,如验证、清洁及净化。尽管这些术语表面意义不同,但它们都是指同一个处理:防止非法数据进入应用。 过滤数据有很多种方法,有一些安全性较差。最好的方法是把过滤看成一个检查的过程,在你使用数据之前都检查一下、看它们是否符合合法数据的要求。不要试图好心地去纠正非法数据,而要让用户按你制定的规则去输入数据。历史证明了试图纠正非法数据往往会导致安全漏洞。举个例子:“某银行系统升级之后,如果密码后面两位是0,只要输入前面四位就能登录系统”,这是一个非常严重的漏洞。
《Go Web编程》编辑推荐:Go语言性能好、语法简单、开发效率高!一起来探索Go语言吧!《Go Web编程》特别适合从事PHP/Python/Ruby/Node.js等Web开发的读者,通过《Go Web编程》可以了解编译型语言怎么写Web应用开发,系统底层怎么进行网络通信。还适合从事C/C++/Java等系统级别开发的读者,通过《Go Web编程》可以了解到Web开发的一些知识,例如,如何处理表单,如何进行用户认证以及Session/Cookie等各方面的Web应用。
为什么我可以如此坚定地相信,选择Go语言不会有错,并且相信Go语言会成为未来十年最流行的语言?除了Go语言的并发编程模型深得我心外,Go语言的各种语法特性显得那么深思熟虑、卓绝不凡,其对软件系统架构的领悟,让我深觉无法望其项背,处处带给我惊喜。——许式伟,七牛云存储CEOGo语言的目标是成为集合解释型编程的轻松、动态类型语言的高效及静态类型语言的安全三大优点的编译型语言,同时它对网络编程与多核计算支持非常好。——郭理靖,京东商城云平台资深工程师,高级经理作者是国内较早研究GO语言在网络应用的实践和推广者,该书讲述了GO语言在Web开发方面的应用,例子详实,文章充实。不管是新手还是老鸟,读之受益匪浅。——网友@waylau作者长期的Web开发经验和大量的实用技巧,使得本书的实用性远非其他空讲语法及概念的书籍可比。无论作为Go语言入门教程还是作为工具书,都是读者极好的选择。——网友@xgdapg认真读过该书,作者讲解深入浅出,并且用beego和beedb开发了几个自己的项目,非常好,适合新人。——网友@JessonChan作者作为国内Go语言的践行先驱,出手确实不一般。本书无论是学习Go语言还是Web编程相关概念和工具,都是一本值得反复阅读的好书。——网友@aaronyue作为谷粉同是也是个码农,当然不能放过Go语言,这本书让我受益匪浅,非常感谢!——网友@Xuyuanp
无
是国内go语言最有技术含量的一本书,读完电子版后决定买一个实体书,因为书写得真心好
书中讲到了一些常见的基础语法,可以作为Go语言的入门书。同时语法不是这本书的重点,书的内容覆盖了web开发的几个常见的部分,所以也可以做为web开发的参考。不仅仅是入门的选择,其中甚至有些东西也给我这种老程序员不少启发。而访问作者在github上的其他资源,也是大有收获。这里值得强调的是,作者的开源和分享的精神,值得我们尊敬。获悉作者正在写另外一本书,讲GO和unix的,仅看到目录,就令人期待。我觉得,无论你是刚毕业还是已经工作过3、5年,像这么一个技术大牛的东东,是值得关注的。
内容比较简单,从0知识讲述GO语言,和普及了web编程基础知识.
这本书非常值得推荐,内容充实。覆盖面很大。
还算不错,买的值得,讲的还是挺全的
我是看的开源电子版的,一颗星是给开源打的,本书中基础部分有许多选自另一本开源的go教程,在panic那章,几乎一模一样。剩下的内容也就是互联网摘抄,买一本真的是没有必要了。但是中文内容匮乏,不妨一看。有能力的还是去读program in go和way to go吧
挺好的,粗略看了下,从go基础开始看很好懂
内容还可以,就是有太多不是go语言的东西了。这本书给初学者还不错。
正在阅读中,暂无评价.
纸质很好,装订也很不错,总之值得买!
许多技术细节没写,只能算一般,不适合初学者
目前学习GO语言的好书籍,期待新的书籍.
买国内的专业类技术书这本书是第一次让我觉得买的很值的一本书。就像Go语言一样,这本书的特点是简洁、明快,简单而又直接的将Go语言讲明白了。即使有网络免费版,也还是买本实体书来支持作者。
Go语言的中文书的确没多少。所以还是先支持一下(开源图书但一定要买本支持下)。但是这本书的最大问题就是前面大量的篇幅在讲Go的语法,而后面进入Web编程的正题之后却实在是写得太简略了。
今天刚买,还没到,但我在github上面已经看了一段时间,是在不习惯看电子书,所以买了本,