go for web
TRANSCRIPT
Go语言也适合做web开发翁伟 @ 希品科技
关于我
• 翁伟,汕头人,原常驻新加坡
• 不断折腾(10年?)的全端程序员
• .net -> py -> php -> go
• 再次回国创业,觅伙伴
关于Go
–Rob Pike
“Go is a programming language designed by Google to help solve
Google's (big)problems. ”
– 许式伟
“Go,互联网时代的C,下一个C”
–Derek Collison
“Go语言将在两年内制霸云计算领域!”
Go很高大上!但能用来做简单web网页好使不?
Web? 上MVC!
• Go的MVC框架已经有一堆
• Beego / Martini / Revel….
• MC两层各有特色
• V层基本都一样:Go HTML Template
–谢孟军
“之前一直专注于开发一个form表单控件,但是最近看了这篇文章之后,http://t.cn/RvPKJn1 觉得我自己走偏了道路, 从目前各家使用Go的
公司来看,是最适合做API类型的应用…”
王垠:Go HTML Template库• “基本可用”的模板方式
• template里面夹带的代码,居然不是Go语言自己
• 表达能力相当弱
• 需要的数据全都放进同一个结构
• 每个帮助函数又需要一定的“注册”信息
• 相当的麻烦和混乱
–王垠
“要做网站,恐怕还是最好使用其他语言比较成熟的框架。”
要适合做web,模板必须要好!
– 维基百科
“PHP(全称:PHP:Hypertext Preprocessor,即“PHP:超文本预处理器”)是一种开源的通用计算机脚本语言,尤其适用于网络开发
并可嵌入HTML中使用。”
在html中嵌入编译语言Go?
• “不可能,Go没有解释器”
• “Go不是脚本”
我不这样想…
• Go是图灵完备的语言
• 没有Go做不到的
• 只有Go做起来比别的语言麻烦
• 在HTML中嵌入编译语言显然是可以的
• ASP.Net
Razor
• ASP.NET MVC默认模板
• 支持嵌入 c# / vb.net
• .Net程序员用过基本都说爽(包括我):
• http://www.zhihu.com/question/19973649
搞个GoRazor有多麻烦?
GoRazor
• http://github.com/sipin/gorazor
• 一个晚上搞定PoC
• 团队不断完善:214 commits
• 项目(60万行Go代码!)验证
• 非常可用的模板,完美语法高亮 + 自动补全的Sublime插件
• template里面夹带的代码,就是Go,不用学新语法
• 表达能力相当强
• 调用模板就是调用函数,数据即函数参数
• 帮助函数不需要注册: 模板内直接 import
• 相当的方便和清晰
演示
当然,有视图引擎远远不够
Go能否适合web动态开发需求?
动态需求
• web是以字符串为核心
• Go是静态编译语言,能否:
• 通过字符串获得对象属性?
• 通过字符串调用类/模块函数?
• 通过类名字符串创建对象?
反射
• 反射可以解决绝大部分需求
• 可以看看 Martini
Go反射的问题
• 不说性能
• 繁琐、难用
• 编译错误转至运行错误
不是一定要用反射
还可以用代码生成
举个栗子
• HTTP Post form 绑定至对象
• NewXXXObjByID(namespace, classname, id string)
• ReadForm(params map[string]string)
• 等等方法,都是生成出来的
• 所以,我们项目代码量约60万行...
• 代码生成可以让静态编译语言更加“动态”
• Go可以,显然别的也静态语言也可以
• 但编译速度怎么样?
完整编译
模板修改增量编译
• GO的编译速度是很惊人的!
• 这是60万行Go代码的项目 + Mid 2011 Macbook Air
• 基本可保持 ctrl + s / alt + tab / F5 的 web开发节奏
回到动态
• 若编译慢,便不可大量使用代码生成方案让其变得“动态”
• Go编译极其快
• Go的动态表现还有其独到之处
– Rob Pike
“如果只能选择一个Go语言的特性移植到其他语言中,我会选择接口”
Go的接口
• 先有类型、方法
• 后有接口定义
• 运行时查询接口
–许式伟
“让语言内置接口查询,这是一件非常了不起的事情。”
举个栗子
• 检查对象是否有“GetUserID”方法
• 如果有,则判断是否为当前用户
• 如果是,则允许修改
再举个栗子
• 检查对象是否有“IsDistributed”、“GetPersistentNode”方法
• 把对象复制去集群其它存储节点
把栗子堆起来...
• Go的接口允许查询原始对象的方法
• 随时转换接口
• 接口可以在任意地方新定义
• 无需把对象实现的所有接口组合都定义在对象本身
重新发明网页开发的轮子没有意义
但是!• “几个页面”随便怎么做都行
• Go当然也非常适合
• 中型web应用,比方说论坛
• 现在肯定是php / Rails / Django / Asp.Net成熟
• Go也可以做,如果你喜欢重新发明轮子的话
• 大型网站呢?
大型网站的需求
• 稳定压倒一切
• 分布式
• SOA 面向服务架构
• 极致的性能
• 代码重构(若用GoRazor,页面模板都是强类型)
• 快速出原型,以后再换技术、平台是可行的
• 这是技术债务!
• 若可以少欠一些技术债务,何乐而不为?
做大型网站,Go很合适!
最后,我想谈一谈Go与创业
引用资料
• https://talks.golang.org/2012/splash.slide
• http://open.qiniudn.com/go-next-c-pptx.pdf
• http://www.csdn.net/article/2012-09-14/2809984-will-go-be-the-new-go-to-programming-lan
• http://weibo.com/1889019865/B4nx3z6GF
• http://www.yinwang.org/blog-cn/2014/04/18/golang/
• http://zh.wikipedia.org/wiki/PHP
• http://www.ituring.com.cn/article/1339