重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
有好几次,当我想起来的时候,总是会问自己:我为什么要放弃Go语言?这个决定是正确的吗?是明智和理性的吗?其实我一直在认真思考这个问题。
创新互联-企业级云服务器提供商,为用户提供云服务器、CDN、云安全服务、中国电信成都枢纽中心、服务器租用、高防服务器租用等全方位云服务与各行业解决方案,帮助企业及个人极速备案,轻松上云,安全无忧。
开门见山地说,我当初放弃Go语言(golang),就是因为两个“不爽”:第一,对Go语言本身不爽;第二,对Go语言社区里的某些人不爽。毫无疑问,这是非常主观的结论。转载
1.1 不允许闭举迟左花括号另起一行
1.2 编译器莫名其妙地给行尾加上分号
1.3 极度强调编译速度,不惜放弃本应提供的功能
1.4 错误处理机制太原始
1.5 垃圾回收器(GC)不完善、有重大缺陷
1.6 禁止未使用变量和多余import
1.7 创建对象的方式太多令人纠结
1.8 对象没有构造函数和析构函数
1.9 defer语句的语义设定不甚合理
1.10 许多语言内置设施不答纯支持用户定义的类型
1.11 没有泛型支持,常见数据类型接口丑陋
1.12 实现接口不需要明确声明轿李
1.13 省掉小括号却省不掉花括号
1.14 编译生成的可执行文件尺寸非常大
1.15 不支持动态加载类库
报错信息如下:
[logid: 3628171316][json.err: EOF] [exception:EOF] goroutine 20521 [running]:
原因:
在清陆请求体为json的请求中,调用了parsePostForm方法,方法大致内容如下:
在这个方法中,会读取http的请睁正清求体。
在这里被读取的时候,后面又重新读取一次,之后解json
后面读到的请求体是空的,解json的时悉前候就会报错EOF
总结:golang中http请求报错eof,多半是因为多次读取了请求体
一.几种公共方法
1)Print: 输出到控制台(不接受任何格式化,它等价于对每一个操作数都应用 %v)
print 在golang中 是属于输出到标准错误流中并打印,官方不建议写程序时候用它。可以再debug时候用
2)Println: 输出到控制台并换行
3)Printf : 只可以打印出格式化的森稿字符串。只可以直接输出字符串类型的变量(不可以输出整形变量和整形等)
4)Sprintf:格式化并返回一个字符串而不带任何输出
5)Fprintf:来格式化并输出到 io.Writers 而不是 os.Stdout
二.带占位符输出--网址:
和python差不多的道理,这里简单补充
v 值的默认格式
%+v 添加字段名(如盯凯结构体)
%#v 相应值的Go语法表示
%T 相应值的类型的Go语法表示
%% 字面上的百分号,并非值的占位符
%c 相应Unicode码点所表示的字符
%x 此则孝 十六进制表示,字母形式为小写 a-f
%X 十六进制表示,字母形式为大写 A-F
%U Unicode格式:U+1234,等同于 "U+%04X"
从2013年起,经朋友推荐开始用Golang编写游戏登陆服务器, 配合C++做第三方平台验证. 到编写独立工具导表工具GitHub - davyxu/tabtoy: 跨平台的高性能便捷电子表格导出器. 以及网络库GitHub - davyxu/cellnet: 简单,方便,高效的Go语言的游戏服务器底层. 最终使用这些工具及库编写整个游戏服务器框架, 我的感受是很不错的
细节型梁派看来, 有如下的几个点:
语言, 库
Golang语言特性和C很像, 简单, 一张A4纸就能写完所有特性. 你想想看, C++到了领悟阶段, 也只用那几个简单特性, 剩下的都是一大堆解决各种内存问题的技巧. 而Golang一开始就简单, 何必浪费生命去渣好研究那一大堆的奇技淫巧呢?
Golang的坑只有2个:1. interface{}和nil配合使用, 2. for循环时, 将循环变量引入闭包(Golang, Lua, C#闭包变量捕获差异) 完全不影响正常使用, 复合语言概念, 只是看官方后面怎么有效的避免
用Golang就忘记继承那套东西, 用组合+接口
用Golang服务器如何保证解决游戏服务器存盘一致性问题? stop the world是肯定的, 但是Golang可以从语言层并发序列化玩家数据, 再通过后台存盘
channel是goroutine虽然是Golang的语言特性. 但是在编写服务器时, 其实只有底层用的比较多.
Golang的第三方库简直多如牛毛, 好的也很多
不要说模板了, C#的也不好用, 官方在纠结也不要加, 使用中, 没模板确实有点不方便. 用interface{}/反射做泛型对于Golang这种强类型语言来说,还是有点打脸
运行期
Golang和C++比性能的话, 这是C++的优势, Golang因为没虚拟机, 只有薄薄的一层调卜贺度层. 因此性能是非常高的, 用一点性能牺牲换开发效率, 妥妥的
1.6版后的GC优化的已经很好了, 如果你不是高性能,高并发Web应用, 非要找出一堆的优化技巧的话. 只用Golang写点游戏服务器, 那点GC损耗可以忽略不计
和其他现代语言一样, 崩溃捕捉是标配功能, 我用Golang的服务器线上跑, 基本没碰到过崩溃情况
热更新: 官方已经有plugin系统的提交, 跨平台的. 估计很快就可以告别手动cgo做so热更新
开发, 调试, 部署, 优化
LiteIDE是我首选的Golang的IDE, 虽然有童鞋说B格不高. 但这估计实在是找不到缺点说了, 别跟我说Visual Studio, 那是宇宙级的...
曾经听说有人不看好Golang, 我问为啥: 说这么新的语言, 不好招人,后面打听到他是个策划... 好吧
真实情况是这样的: Golang对于有点编程基础的新人来说, 1周左右可以开始贡献代码. 老司机2~3天.
开发效率还是不错的, 一般大的游戏功能, 2*2人一周3~4个整完. 这换C++时代, 大概也就1~2个还写不完. 对接服务器sdk的话, 大概1天接个10多个没问题
Golang自带性能调优工具, 从内存, CPU, 阻塞点等几个方面直接出图进行分析, 非常直观, 可以参考我博客几年前的分析: 使用Golang进行性能分析(Profiling)
Golang支持交叉编译, 跨平台部署, 什么概念? linux是吧? 不问你什么版本, 直接windows上编译输出一个elf, 甩到服务器上开跑.不超过1分钟时间..