搞定了第一个 Go WEB 项目,随手写写流水账。无技术内容,纯扯蛋

2016-04-27 03:12:50 +08:00
 realpg

很早就了解 Go 语言,毕竟是 google 开发的,总归会引起我的兴趣。 刚开始接触是 Go 1.2 左右吧,感觉还是很不完善,就大概了解了它是什么,大概要怎么写,然后就放在一边了。

直到 1.5 才捡起来,写了挺多程序,但是全部都是命令行工具之类,辅助运维使用,以及一些数据转换啊之类可以定义为 tools 的东西。

一直知道 golang 是有 web 框架的,但是从 1.5 捡起来一直就没动过 http 包,我日常也不会去抓人家数据,所以也没做过爬虫类应用,一直就看都没看过 http 包,说实话,一个星期之前我已经用 go 写了过几万行生产环境代码,但是我还不精确的知道怎么用 go 创建 webserver ,毕竟 PHP 是世界上最好的语言你懂的。

然后之前的某一天心血来潮,其实是我的 mac 挂了送修, windows 机器上并没有 php 环境,然后个人维护的非盈利小众软件 /网站系统来了需求,正好想试用 Micro$oft VSCode ,就用 VSCode 装了个 Go 语法,试着用 Go 实现一把。

查阅了 http 包手册,发现跟预想一样的创建 httpserver 如此简单,基本的简易路由功能也带了(用屁股也能知道会有很多第三方开源强大的路由程序但是我没用,想从头体验一把自身的)

然后之前没接触 go-redis ,果断去 gaythub 找找库,大家推荐最多的 redigo ,嗯嗯,下来,一查卧槽这特么就是直接发命令的一个包装,这特么也太麻烦了吧,总不能我的 model 里还得自己创建 REDIS 类 CLI 命令发 CMD 吧,就这种玩意还能最多推荐最多 star ?老外都怎么想的!自己再二次封装出来,图个啥,继续 gaythub 找找找,找到了一个啥名字记不住了包名叫 redis.v3 的还不错,好歹可以直接 redis.Set(),redis.Get()了

然后轻车熟路的写好逻辑,纯手动调试(没办法我只有个 VSCode 有语法提示就不错了),还好自己写的代码质量还可以,总共没几个 BUG 都很快修复都是入门的问题,然后推上线,看到 execute_time 真是内牛满面啊

写 PHP 习惯了 30ms 起步的我,看到单请求处理时间,用纳秒表示的(懒, time 库时间戳高精度默认就是纳秒单位,超级不喜欢 float 喜欢 int 就直接输出了),单请求处理在 60 万到 80 万纳秒之间(服务器是破 PC 丢政府机房的,别吐槽性能),内牛满面啊,这性能,啧啧……我也能写用纳秒表示执行时间的 web application 了……(虽然实际是微秒级,大约 0.6ms 到 0.8ms ,有数据库操作)

然后没事儿去 google 搜一个 html template 高级语法的问题,无意发现一群老外在吐槽 html/template 性能太操蛋了,说什么同页面渲染比 PHP 都慢,纳尼?我怎么没发现。

然后仔细一搜,结合想了一下推过去的都是 interface{},各种 reflection ,估计还真是要慢,可是这也很快了,我都知足了。那找找看看快的什么样吧。

于是找了个自称很快的 go 模板系统,编译成 go 文件的,估计这种是最快的了,先改了三五个页双渲染,一对比, html/template 的执行时间 750000 ,那个很快的, 25000 ,单位纳秒……

然后果断把所有 html/template 都删了,现在 F5 刷着页面,看着那个 25000 的数字,就想笑,然后被旁边人当成精神病有木有!

以后小网站用啥做,真是纠结,要知道 PHP 是世界上最好的语言,没有之一……纠结

6445 次点击
所在节点    程序员
14 条回复
zaishanfeng
2016-04-27 05:50:23 +08:00
然而百分之九十九的情况你都不需要这么快的速度 而是需要 rapid develop
gamexg
2016-04-27 07:10:34 +08:00
@zaishanfeng 用过几种语言语言,感觉 go 写起来很舒服,写起来也挺快。
也许我技术弱,现在真心觉得动态类型一时爽,重构火葬场。
代码单元测试覆盖了主要流程,后期修改起来也需要很小心。
WildCat
2016-04-27 07:27:34 +08:00
@gamexg +1
herozzm
2016-04-27 08:13:22 +08:00
LZ 能说说运维 tool 吗?最近在找非 web 项目练手
ebony0319
2016-04-27 08:19:51 +08:00
难道只有我关心头像么?
only0jac
2016-04-27 08:55:49 +08:00
楼主的数据库操作直接 sql 还是 orm ?
itfanr
2016-04-27 09:14:52 +08:00
@ebony0319 头像果然牛
coyove
2016-04-27 09:35:24 +08:00
楼主这么关心性能,数据库操作可以看看 https://github.com/jackc/go_db_bench/tree/master/raw
手写实现 postgres wire protocol ,速度秒杀 database/sql
lixiaohan
2016-04-27 09:41:42 +08:00
@gamexg 你真觉得 go 写起来很爽啊, 真是用的深的时候 你就知道了 很多不爽的地方, 唉
penjianfeng
2016-04-27 09:43:42 +08:00
golang 很爽,必须爽,然而我写了这么久一直觉得 template 真的....好扯淡-_-||不过想想也是,静态语言的软肋
gamexg
2016-04-27 10:25:42 +08:00
@lixiaohan 能说说 go 的坑吗?现在只是个人小项目上面使用 go ,用的深的时候有哪些问题?
cloudzhou
2016-04-27 10:40:57 +08:00
@lixiaohan 你说说看,不爽的地方
realpg
2016-04-27 11:52:27 +08:00
@zaishanfeng

或许是我这个需求有点简单,我没觉得比写 PHP 慢太多,不是不慢,是不慢太多。

@herozzm
都不是通用的 tool ,就是有啥需求了,比如临时处理日志找哪个傻逼写的东西被注入了啊,比如搭建数据中转桥啊,之类的。通用的大型运维框架都是用成熟的。


@coyove
并不是“真的”这么关心性能,只是这个东西是我的第一个 web 项目,多研究研究总没错吧,有人说慢,不真的用快的测试测试哪知道是不是真的慢


@only0jac
直接 SQL ,没用 ORM ,查看了一下 sql_optimize_log ,总共一百九十七种查询,常年优化的习惯,所有查询都写在文本文件里,便于回头没事儿对着 sql 文件发呆发现大坑


@gamexg
动态类型重构火葬场?没发现。那一定是你的猪队友搞的,或者猪队长没有设计好规范。动态语言并不是让你去任意发挥瞎写。很多时候可以很好地使用动态特性,低耦合,大模块做好文档,像 node 那样拆分单一功能包,最不济写的烂小模块重写完全不管你怎么实现的。
julor
2016-04-27 22:05:12 +08:00
觉得不错!在一些小工具用过

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/274661

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX