现在终于正式和一泡污一样的beego说再见了,真是可喜可贺~
标题上提到的beego,我的网站有一个核心功能session用到了它提供的模块。但这个模块的设计十分反人类:
- 搞了一个struct直接写入文件,但偏偏这个struct必须提前用gob声明,否则报错进程崩溃
- 使用file模式时特定情况下写入会失败但又得不到任何反馈,导致下一个请求得到的数据是上上次的
结果,我用这个session模块来做验证码功能时,特定时间段特定用户会一直出现:即时输对了也对不上号,因为特么上上次请求生成的验证码才是你需要输入的。
开始一切都没有,我只能选择用这个不靠谱的session模块。现在有时间了,我直接自己实现了一个session模块替换了它,终于再也不出现这个其妙的问题了。
初接触golang做网站时,发现上手最大的问题并不是语法点多,而是各种官方模块的缺少,因此我做网站时首先给予自己所掌握的mvc
常识实现了一个简单的后台框架,然后一些容易实现的细节就自己写掉了,而较繁琐的点,例如 formdata表单处理,session,mysql,webdev 等则用了别人的模块直接装上去。就这样一部拼拼凑凑的破车也挂了个golang的牌挤上了互联网的大桥,开启了漫长而看不到尽头的开发之路。
做了大半年,用了第三方模块大都是比较靠谱的,mysql可以说是一次差错都没有出现过,结巴分词虽然有几次引起了进程直接崩溃的错误,但后来调整了使用方式,渐渐地这个问题出现频率减少到可以忽略的地步了。
用golang遇到过最大的问题就是进程崩溃。但偏偏这个问题是不可能完美解决的,因为任何一次新功能上线都有可能因某一处差错而产生意外。所以我自己实现了一个守护进程的方法,让跑崩掉的进程崩溃日志写到文件,然后自动重启。
其实直接用golang而不封装一些基础类型的方法来写一个网站那是不可能的,除非真的有这么多人力可以被挥霍。我从一个javascript工程师的角度来谈这个问题,是因为javascript支持了太多有用的数据类型了,而最有用的 Array和Object偏偏golang没有提供原生支持,String原生支持也有隐藏坑:
- slice不支持泛型,不能把数字,字符串,对象统统放在一个数组里面。并且各种Array类的操作完全不支持,比如
pop
,slice
,splice
,concat
等。现在我摸索出来golang比较好的实现方式是,定义interface{}类型的鸭子slice,再自己去实现各种需要的Array类方法 - string不支持utf8,utf8的字符串必须用
[]rune
,这个坑说起来就太大了,因为我用过一个otto的模块,其对字符串处理就是用的string
类型,但统计出来的长度又是用的[]rune
,结果就导致substr出来的结果是错的。 - map必须给多线程使用加读写锁,否则进程直接崩溃。并且map遍历是无序的,其随机顺序随每一次编译而不一样。
其他还有一些经历暂时想不到,以后有时间再记录吧。
相关文档
随便看看