go for web

61
Go语言也适合做web@ 希品科技

Upload: weng-wei

Post on 15-Jul-2015

119 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Go for web

Go语言也适合做web开发翁伟 @ 希品科技

Page 2: Go for web

关于我

• 翁伟,汕头人,原常驻新加坡

• 不断折腾(10年?)的全端程序员

• .net -> py -> php -> go

• 再次回国创业,觅伙伴

[email protected]

Page 3: Go for web

关于Go

Page 4: Go for web

–Rob Pike

“Go is a programming language designed by Google to help solve

Google's (big)problems. ”

Page 5: Go for web

– 许式伟

“Go,互联网时代的C,下一个C”

Page 6: Go for web

–Derek Collison

“Go语言将在两年内制霸云计算领域!”

Page 7: Go for web

Go很高大上!但能用来做简单web网页好使不?

Page 8: Go for web

Web? 上MVC!

• Go的MVC框架已经有一堆

• Beego / Martini / Revel….

• MC两层各有特色

• V层基本都一样:Go HTML Template

Page 9: Go for web

–谢孟军

“之前一直专注于开发一个form表单控件,但是最近看了这篇文章之后,http://t.cn/RvPKJn1 觉得我自己走偏了道路, 从目前各家使用Go的

公司来看,是最适合做API类型的应用…”

Page 10: Go for web

王垠:Go HTML Template库• “基本可用”的模板方式

• template里面夹带的代码,居然不是Go语言自己

• 表达能力相当弱

• 需要的数据全都放进同一个结构

• 每个帮助函数又需要一定的“注册”信息

• 相当的麻烦和混乱

Page 11: Go for web

–王垠

“要做网站,恐怕还是最好使用其他语言比较成熟的框架。”

Page 12: Go for web

要适合做web,模板必须要好!

Page 13: Go for web

– 维基百科

“PHP(全称:PHP:Hypertext Preprocessor,即“PHP:超文本预处理器”)是一种开源的通用计算机脚本语言,尤其适用于网络开发

并可嵌入HTML中使用。”

Page 14: Go for web

在html中嵌入编译语言Go?

Page 15: Go for web

• “不可能,Go没有解释器”

• “Go不是脚本”

Page 16: Go for web

我不这样想…

• Go是图灵完备的语言

• 没有Go做不到的

• 只有Go做起来比别的语言麻烦

• 在HTML中嵌入编译语言显然是可以的

• ASP.Net

Page 17: Go for web
Page 18: Go for web

Razor

• ASP.NET MVC默认模板

• 支持嵌入 c# / vb.net

• .Net程序员用过基本都说爽(包括我):

• http://www.zhihu.com/question/19973649

Page 19: Go for web

搞个GoRazor有多麻烦?

Page 20: Go for web

GoRazor

• http://github.com/sipin/gorazor

• 一个晚上搞定PoC

• 团队不断完善:214 commits

• 项目(60万行Go代码!)验证

Page 21: Go for web
Page 22: Go for web

• 非常可用的模板,完美语法高亮 + 自动补全的Sublime插件

• template里面夹带的代码,就是Go,不用学新语法

• 表达能力相当强

• 调用模板就是调用函数,数据即函数参数

• 帮助函数不需要注册: 模板内直接 import

• 相当的方便和清晰

Page 23: Go for web

演示

Page 24: Go for web

• 如果你觉得Go的模板太弱,而不适合做web

• 不妨试试 https://github.com/sipin/gorazor

Page 25: Go for web

当然,有视图引擎远远不够

Page 26: Go for web

Go能否适合web动态开发需求?

Page 27: Go for web

动态需求

• web是以字符串为核心

• Go是静态编译语言,能否:

• 通过字符串获得对象属性?

• 通过字符串调用类/模块函数?

• 通过类名字符串创建对象?

Page 28: Go for web

反射

• 反射可以解决绝大部分需求

• 可以看看 Martini

Page 29: Go for web

Go反射的问题

• 不说性能

• 繁琐、难用

• 编译错误转至运行错误

Page 30: Go for web

不是一定要用反射

Page 31: Go for web

还可以用代码生成

Page 32: Go for web

举个栗子

• HTTP Post form 绑定至对象

Page 33: Go for web
Page 34: Go for web
Page 35: Go for web
Page 36: Go for web
Page 37: Go for web

• NewXXXObjByID(namespace, classname, id string)

• ReadForm(params map[string]string)

• 等等方法,都是生成出来的

• 所以,我们项目代码量约60万行...

Page 38: Go for web

• 代码生成可以让静态编译语言更加“动态”

• Go可以,显然别的也静态语言也可以

• 但编译速度怎么样?

Page 39: Go for web

完整编译

Page 40: Go for web

模板修改增量编译

Page 41: Go for web

• GO的编译速度是很惊人的!

• 这是60万行Go代码的项目 + Mid 2011 Macbook Air

• 基本可保持 ctrl + s / alt + tab / F5 的 web开发节奏

Page 42: Go for web

回到动态

• 若编译慢,便不可大量使用代码生成方案让其变得“动态”

• Go编译极其快

• Go的动态表现还有其独到之处

Page 43: Go for web

– Rob Pike

“如果只能选择一个Go语言的特性移植到其他语言中,我会选择接口”

Page 44: Go for web

Go的接口

• 先有类型、方法

• 后有接口定义

• 运行时查询接口

Page 45: Go for web

–许式伟

“让语言内置接口查询,这是一件非常了不起的事情。”

Page 46: Go for web

举个栗子

• 检查对象是否有“GetUserID”方法

• 如果有,则判断是否为当前用户

• 如果是,则允许修改

Page 47: Go for web
Page 48: Go for web

再举个栗子

• 检查对象是否有“IsDistributed”、“GetPersistentNode”方法

• 把对象复制去集群其它存储节点

Page 49: Go for web
Page 50: Go for web

把栗子堆起来...

Page 51: Go for web
Page 52: Go for web
Page 53: Go for web

• Go的接口允许查询原始对象的方法

• 随时转换接口

• 接口可以在任意地方新定义

• 无需把对象实现的所有接口组合都定义在对象本身

Page 54: Go for web

重新发明网页开发的轮子没有意义

Page 55: Go for web

但是!• “几个页面”随便怎么做都行

• Go当然也非常适合

• 中型web应用,比方说论坛

• 现在肯定是php / Rails / Django / Asp.Net成熟

• Go也可以做,如果你喜欢重新发明轮子的话

• 大型网站呢?

Page 56: Go for web

大型网站的需求

• 稳定压倒一切

• 分布式

• SOA 面向服务架构

• 极致的性能

• 代码重构(若用GoRazor,页面模板都是强类型)

Page 57: Go for web

• 快速出原型,以后再换技术、平台是可行的

• 这是技术债务!

• 若可以少欠一些技术债务,何乐而不为?

Page 58: Go for web

做大型网站,Go很合适!

Page 59: Go for web

最后,我想谈一谈Go与创业

Page 60: Go for web

Q & A

• QQ: 124424

• 微信:Wuvist

• 欢迎投简历 [email protected]

(公司网站还没做~^_^)

Page 61: Go for web

引用资料

• 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