Go from Ruby to Go

iwinux · 2012年10月25日 · 最后由 crazyjin 回复于 2013年12月24日 · 6641 次阅读

最近很蛋疼地想试试用 Go 语言写 web app,写着写着就开始想念 Rails 的 “无微不至” 了:

  1. DB migration: Sorry,Go 里面没有这种工具,没有神奇的 go generate migration,只好自己写了个 bash 脚本来管理,仿照 Rails 的做法,在数据库里建一个表 schema_migrations,记录已运行的 migration 的版本号(目前只支持 PostgreSQL),暂时不支持 rollback……

  2. Routing: 官方库 net/httpDefaultServeMux 只支持 static URL,还好有第三方的 gorilla/mux,这个库支持 URL 的正则匹配、方法过滤、子域等等,比较接近 Rails 的风格

  3. ORM: 貌似有一些现成的 ORM 库,但是我想试试手写 SQL——前天翻 PostgreSQL 文档并自己试验才弄明白了 SQL 注入的防护方法,算是额外的收获,而这些在 Rails 里面几乎没有接触过(人家都帮你做好了)

  4. 前端:Go 写后端服务可以很拉风,但处理前端问题的时候还是要 Ruby 来救场——大家有没有注意过,sass / haml / coffeescript 这些全是 Ruby 写的东西,被迫在项目里加了个 Gemfile,haml 和 coffeescript 可以跳过,但 sass 已经离不开了。顺便试用了下 jammit 这个工具,可以模拟出 asset pipeline 的效果。

现在我写代码时总是想着 “Rails 是如何如何做的”,中毒太深了……

重新回到 ruby 的路过。。。

#1 楼 @zhangjinzhu 我也没有放弃 Ruby,只是试玩一下 Go。企图一下子用 Go 取代 Ruby 的话,会很痛苦的,在生产环境也不现实~

#2 楼 @iwinux 用 go 完成一个 web 应用之后,感觉时间成本太高了,花费时间至少要是 rails 的 2 倍,维护的时间成本也高

特别是在你做的程序的前景都不明了的时候,快速实现才是王道。。。

Rails 的 “无微不至” 很贴切啊,昨晚做一个功能的时候我又再一次感受到了

rails 是最能快速实现 APP 的玩意?

@zhangjinzhu 赶紧叫领导来战啊……

#6 楼 @raven 哈哈,我感觉这方面没有争议,关键是每个人的着眼点不同

Rails 开发 Web 确实快,可是 taobao.com 肯定不会用,因为他考虑的首要要素已经不是开发的速度了

所以技术选型完全是和你的着眼点相关。。。

Go 我体验最深刻的就是

  • 编译通过就几乎没什么 Bug,可以毫无顾忌的修改,然后让编译器帮你找错误,编译的错误都修了,就差不多了。
  • 占用内存小,随便写写应用,用个 512M 服务器跑跑,就顶住不小的流量了。
  • 并发模型 goroutine,channel,其他语言都没有,可能除了 Erlang
  • 那需要什么各种 Worker 队列 (resque 等) 做异步处理啊,多装一个服务,就要多管这个服务的死活,和中间调用的各种错误,直接 goroutine,只要这个服务器的进程还在,队列就好用
  • 安装部署新服务器太简单了,一个 go get 全盘搞定,哪还需要什么 capistrano 啊。我们的部署脚本就 6,7 行 shell 脚本。
  • 编译出来就一个文件,啥都不依赖,哪需要装什么 gem,再编译什么 binding,再编译不了,再各种 Google 各种 Make 参数啊。
  • 处理 IO 和二进制流太得心应手了,Go 之前,我都没怎么理解什么是 Stream,只会把大块二进制搞到内存里,然后再发给浏览器,这能不占内存吗。。
  • 目前在用 mongo,所以还没想 ORM 的问题,但是直觉 ORM 会容易出性能问题,只是感觉
  • 官方库太牛 B 简介明了了,哪需要什么 Core Library 和什么 Standard Library 啊,直到现在我也没搞清楚他们的区别。

#10 楼 @sunfmin 逻辑错误编译器无能为力吧。

写错代码当然能写了,但是帮你挡住大部分的工作了,我们现在用到的包,几乎随便升级,如果有问题,就会编译不通过,然后改改就好了,但是 Ruby 哪敢随便升级 Gem 啊,不是找死吗。。系统流程不跑一遍都心突突。

哦,顺便推下https://qortex.net/ 纯 Go 编写,服务器在 EC2,所以国内访问速度一般,但是可以用。 很久没用象现在这样不怎么担心性能问题了,估计顶到出性能问题的时候,我们也该赚些钱了。。出性能问题也是 mongo 先出估计。

#12 楼 @sunfmin 难道 go 没有包依赖的问题么?

#14 楼 @chenge 估计只是因为接口没变动而已,这样来判断是否能升级包还是很危险的。。

#10 楼 @sunfmin stackless 被你无视了啊,lua 估计加个库也成,Mozilla 的 Rust 也是。Erlang 那不是 channel。一个是 CSP,一个是 Actor model,适用场景还是有区别的。总的来说,不觉得 Go 有啥特别的,能支持 CSP 的语言或者平台不少的,能比较好实现 Actor model 的,能用的却只有 Erlang。

#10 楼 @sunfmin Mongo 难道没性能问题么。这年头竟然还有自称数据库的东西,很自豪地不支持 MVCC。

#14 楼 @chenge 因为没有现成的库吧...

#13 楼 @sunfmin wow~~!! 之前看到了你们的招聘贴,原来你们在用 Go 做开发(好诱人

#16 楼 @bhuztez 同意你对 MongoDB 的吐槽,像它能做的事情 PostgreSQL 基本都能做到了,都不知道优势在哪 XD

#14 楼 @chenge #13 楼 @sunfmin

关于 Go 的包依赖问题我之前稍微了解过,目前第三方库的约定是这样的:

  1. master 分支永远是可用的
  2. go get 会默认抓取 master 分支
  3. 任何破坏现有 API 的改动都要在另外的分支中进行

感觉远远不够 Ruby 的 bundler 那么灵活,但是暂时没有遇到太大问题

#10 楼 @sunfmin 有什么学习 Go 的入门好书或者资料可以推荐的吗?

go 的 web developing 现在还是野蛮生长阶段,各种框架百家争鸣.. 拼框架显然拼不过几乎一统江湖的 rails. 对此,两者都浸淫不浅的人的结论才比较值有参考价值. 个人认为 go 目前就有两点比较不爽. 一个是删除一个 slice, 另外是自带的正则支持太弱了.

在用 Go 的时候,去 IRC 上问问题,但是大部分都被人指到 http://golang.org/ref/spec 里面的某一部分去详细读就知道怎么回事了,所以那个 The Go Programming Language Specification 包罗万象,非常重要。

#19 楼 @huacnlee 鼓吹 Go 而已,哈哈哈

#16 楼 @bhuztez 没学过 stackless。。。Erlang 也一知半解,看来话不能说绝对了。。

等 Go 再发展个 3 到 5 年 , 估计很多库也会不兼容. 写库的人把 api 改掉了..

#13 楼 @sunfmin https://qortex.net/ 的用户验证时怎么做的啊?

哪位高人出来带头用 go 重新实现一个 rails 吧。

来个 Go on Rails!

需要 登录 后方可回复, 如果你还没有账号请 注册新账号