SlideShare une entreprise Scribd logo
1  sur  61
Go语言也适合做web开发 
翁伟@ 希品科技
关于我 
• 翁伟,汕头人,原常驻新加坡 
• 不断折腾(10年?)的全端程序员 
• .net -> py -> php -> go 
• 再次回国创业,觅伙伴 
• wengwei@xipintech.com
关于Go
“Go is a programming language designed by Google to help solve 
Google's (big)problems. ” 
–Rob Pike
“Go,互联网时代的C,下一个C” 
– 许式伟
“Go语言将在两年内制霸云计算领域!” 
–Derek Collison
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 
• 不妨试试https://github.com/sipin/gorazor
当然,有视图引擎远远不够
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的动态表现还有其独到之处
“如果只能选择一个Go语言的特性移植到其他语言中, 
我会选择接口” 
– Rob Pike
Go的接口 
• 先有类型、方法 
• 后有接口定义 
• 运行时查询接口
“让语言内置接口查询,这是一件非常了不起的事情。” 
–许式伟
举个栗子 
• 检查对象是否有“GetUserID”方法 
• 如果有,则判断是否为当前用户 
• 如果是,则允许修改
再举个栗子 
• 检查对象是否有“IsDistributed”、“GetPersistentNode”方法 
• 把对象复制去集群其它存储节点
把栗子堆起来...
• Go的接口允许查询原始对象的方法 
• 随时转换接口 
• 接口可以在任意地方新定义 
• 无需把对象实现的所有接口组合都定义在对象本身
重新发明网页开发的轮子 
没有意义
但是! 
• “几个页面”随便怎么做都行 
• Go当然也非常适合 
• 中型web应用,比方说论坛 
• 现在肯定是php / Rails / Django / Asp.Net成熟 
• Go也可以做,如果你喜欢重新发明轮子的话 
• 大型网站呢?
大型网站的需求 
• 稳定压倒一切 
• 分布式 
• SOA 面向服务架构 
• 极致的性能 
• 代码重构(若用GoRazor,页面模板都是强类型)
• 快速出原型,以后再换技术、平台是可行的 
• 这是技术债务! 
• 若可以少欠一些技术债务,何乐而不为?
做大型网站,Go很合适!
最后,我想谈一谈Go与创业
Q & A 
• QQ: 124424 
• 微信:Wuvist 
• 欢迎投简历wengwei@xipintech.com 
(公司网站还没做~^_^)
引用资料 
• 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

Contenu connexe

Similaire à Go for web

构建可维护的Javascript 小米网
构建可维护的Javascript 小米网构建可维护的Javascript 小米网
构建可维护的Javascript 小米网
yang alex
 
GitLab—the new workbench
GitLab—the new workbenchGitLab—the new workbench
GitLab—the new workbench
tblanlan
 
InspireDGT_2013 HTML5的可能發展與Web Worker
InspireDGT_2013 HTML5的可能發展與Web WorkerInspireDGT_2013 HTML5的可能發展與Web Worker
InspireDGT_2013 HTML5的可能發展與Web Worker
inspire digital
 
HTML5 生态系统和应用架构模型
HTML5 生态系统和应用架构模型HTML5 生态系统和应用架构模型
HTML5 生态系统和应用架构模型
Tom Fan
 
Android快速发布&持续集成
Android快速发布&持续集成Android快速发布&持续集成
Android快速发布&持续集成
whykill
 
前端也能變全端
前端也能變全端前端也能變全端
前端也能變全端
ericpi Bi
 
Csdn Java电子杂志第1期
Csdn Java电子杂志第1期Csdn Java电子杂志第1期
Csdn Java电子杂志第1期
yiditushe
 
Java Web框架汇总
Java Web框架汇总Java Web框架汇总
Java Web框架汇总
yiditushe
 

Similaire à Go for web (20)

前端编译平台
前端编译平台前端编译平台
前端编译平台
 
构建可维护的Javascript 小米网
构建可维护的Javascript 小米网构建可维护的Javascript 小米网
构建可维护的Javascript 小米网
 
如何,高效利用搜索引擎+构建网络工具箱
如何,高效利用搜索引擎+构建网络工具箱如何,高效利用搜索引擎+构建网络工具箱
如何,高效利用搜索引擎+构建网络工具箱
 
前端開發學習簡介
前端開發學習簡介前端開發學習簡介
前端開發學習簡介
 
Gitlab - the new workbench (2nd edition)
Gitlab - the new workbench (2nd edition)Gitlab - the new workbench (2nd edition)
Gitlab - the new workbench (2nd edition)
 
GitLab—the new workbench
GitLab—the new workbenchGitLab—the new workbench
GitLab—the new workbench
 
InspireDGT_2013 HTML5的可能發展與Web Worker
InspireDGT_2013 HTML5的可能發展與Web WorkerInspireDGT_2013 HTML5的可能發展與Web Worker
InspireDGT_2013 HTML5的可能發展與Web Worker
 
愛創小小聚201307 小強分享
愛創小小聚201307 小強分享愛創小小聚201307 小強分享
愛創小小聚201307 小強分享
 
HTML5 生态系统和应用架构模型
HTML5 生态系统和应用架构模型HTML5 生态系统和应用架构模型
HTML5 生态系统和应用架构模型
 
4. Go 工程化实践-0124-v2.pdf
4. Go 工程化实践-0124-v2.pdf4. Go 工程化实践-0124-v2.pdf
4. Go 工程化实践-0124-v2.pdf
 
Android快速发布&持续集成
Android快速发布&持续集成Android快速发布&持续集成
Android快速发布&持续集成
 
Duck Typing and Multiple Inheritance
Duck Typing and Multiple InheritanceDuck Typing and Multiple Inheritance
Duck Typing and Multiple Inheritance
 
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
 
前端也能變全端
前端也能變全端前端也能變全端
前端也能變全端
 
Csdn Java电子杂志第1期
Csdn Java电子杂志第1期Csdn Java电子杂志第1期
Csdn Java电子杂志第1期
 
Java Web框架汇总
Java Web框架汇总Java Web框架汇总
Java Web框架汇总
 
Go
GoGo
Go
 
Go
GoGo
Go
 
Node.js 進攻桌面開發
Node.js 進攻桌面開發Node.js 進攻桌面開發
Node.js 進攻桌面開發
 
使用GoogleAppEngine建立个人信息中心
使用GoogleAppEngine建立个人信息中心使用GoogleAppEngine建立个人信息中心
使用GoogleAppEngine建立个人信息中心
 

Plus de Weng Wei (13)

Migrate PHP E-Commerce Site to Go
Migrate PHP E-Commerce Site to GoMigrate PHP E-Commerce Site to Go
Migrate PHP E-Commerce Site to Go
 
Metaprogramming Go
Metaprogramming GoMetaprogramming Go
Metaprogramming Go
 
Why use Go for web development?
Why use Go for web development?Why use Go for web development?
Why use Go for web development?
 
谈谈缓存
谈谈缓存谈谈缓存
谈谈缓存
 
用PY实现"Go元编程"
用PY实现"Go元编程"用PY实现"Go元编程"
用PY实现"Go元编程"
 
Go for web
Go for webGo for web
Go for web
 
Python to go
Python to goPython to go
Python to go
 
论使用Python开发推荐引擎的优越性
论使用Python开发推荐引擎的优越性论使用Python开发推荐引擎的优越性
论使用Python开发推荐引擎的优越性
 
Zalora php to_go
Zalora php to_goZalora php to_go
Zalora php to_go
 
A byte of git
A byte of gitA byte of git
A byte of git
 
My understanding of Git
My understanding of GitMy understanding of Git
My understanding of Git
 
Sharding
ShardingSharding
Sharding
 
Inside Zend Framework
Inside Zend FrameworkInside Zend Framework
Inside Zend Framework
 

Go for web