Golang全接触

满打满算, 从好友推荐Golang至发文时, 使用Golang已经有1年多了. 这种时间对于C/C++ Java这些老者来讲, 简直是菜鸟级别的经验html

但做为新生代语言的特色就是实战. Golang这一年里, 已经为项目提供了稳定的服务器和强大的扩展能力, 与客户端的Unity3D里的C#同样, 都是强大, 极致开发效率表明的优秀开发语言.程序员

用途篇

Golang到底拿来作啥? 我须要么?编程

高效(性能,开发)的服务器语言. 包括Web, 游戏, Appjson

编写桌面级UI暂不是很适合设计模式

我须要把如今的C++, Python, Erlang等服务器改为Golang么?api

性能有瓶颈, 开发效率低, 有钱有时间的话, 彻底能够数组

 

评价篇

听过太多的人对Golang的评价, 大概分为这么几类:服务器

C/C++性能党

此类党员对任何事物都追求极致的 性能. 还好Golang是直接生成native code, 不然会被批的体无完肤. 可是因为Golang底层为并发和开发效率而作出的一些系统, 相似于GC, 调度器和分配器等, 会在语言层上损失不少性能. 所以C/C++党仍是有理由批Golang性能低下架构

Erlang并发党

做为电信级元老, Erlang的模型和架构当之无愧, OTP扩展性超级强. 完美的Actor模型也让逻辑编写比OO更加直观并发

CSP与Actor区别仅仅只是在channel的归属范围而已, 但这点细微差异却对两种语言的开发变的迥然不一样

Golang在并发模型上选择了CSP, 就是考虑把架构的设计留给使用者. 像C#同样创建一个类库的世界, 而不是MFC同样的框架世界. 让开发更自由

Erlang的Actor也没错. 让开发更直观, 让崩溃提早来到, 尽快处理

Rust党

Rust在发文时已经发布了1.0. 这让R粉兴奋的穿梭于各大技术论坛和讨论群

但Rust的理念在我看来有点偏执了, 必定要把各类错误在编译期暴露出来, 因此造出了不少不须要的类型和概念, 连语言都比C语言更符号话

大白话说来, 有点编程经验的人看到JavaScript彻底看得懂, 但看Rust却像天书

对比同时期的TypeScript, Dart, Swift. Rust就是有点那么独辟蹊径

该党党员常常性的用各类特性对比Golang, 追求单特性的优秀.

但其实, Golang自己是一门完整哲学. 不少语言特性互相之间有关联. 有设计不当的地方, 固然更多的是完总体系. 不求和其余语言比

只追求解决问题的速度

自定义党

云风看过Golang后, 由于该语言自己就是强化版的C, 所以颇受云风喜欢. 但在一堆评价后, 云风仍是果断选择了C+lua的组合写出的Skynet

虽然不知道缘由, 但我猜的话, 毕竟是对语言自己的可控性还不那么看好

同时, 咱们发现Skynet使用的是Actor模型, 也发现大神级的程序员就是有先见.

转载请注明: 战魂小筑http://www.cppblog.com/sunicdavy

感触篇

设计

踏入Golang, 就不要尝试设计模式

传统的OO在这里是非法的, 尝试模拟只是一种搞笑

把OO在Golang里换成复合+接口

对实现者来讲, 把各类结构都复合起来, 对外暴露出一个或多个接口, 接口就好像使用者在实现模型上打出的不少洞

别怕全局函数, 包(Package)能够控制全局函数使用范围.

不必什么都用interface对外封装, struct也是一种良好的封装方法

Golang无继承, 所以无需类派生图. 没有派生这种点对点的依赖, 所以不会在大量类关系到来时, 造成繁杂不可变化的树形结构

 

容器

用了很长时间map, 才发现Golang把map内建为语言特性时, 已经去掉了外置型map的api特性. 一切的访问和获取都是按照语言特性来作的, 原子化

数组能够理解为底层对象, 你平时用的都是切片, 不是数组, 切片就是指针, 指向数组. 切片是轻量的, 即使值拷贝也是低损耗的

 

内存

Golang在实际运行中, 你会发现内存可能会疯涨. 但跑上一段时间后, 就保持稳定. 这和Golang的内存分配, 垃圾回收有必定的关系

现代的编程语言的内存管理不会很粗暴的直接从OS那边分配不少内存. 而是按需的不断分配成块的内存.

对于非海量级应用, Golang自己的内存模型彻底能够撑得下来. 无需像C++同样, 每一个工程必作内存池和线程池

Channel

Channel和锁谁轻量? 一句话告诉你: Channel自己用锁实现的. 所以在无可奈何时, 仍是尽可能减小使用Channel, 但Channel属于语言层支持, 适度使用, 能够改善代码可读写

转载请注明: 战魂小筑http://www.cppblog.com/sunicdavy

错误

以为Golang不停的处理err? 那是由于平时在其余语言根本没处理过错误, 要否则就是根部一次性try过全部的异常, 这是一种危险的行为

panic能够被捕获, 所以编写服务器时, 能够作到不挂

 

危险的interface{}

这东西就跟C/C++里的void*同样的危险, nil被interface{}包裹后不会等于nil相等, 但print出来确实是nil

模板估计能够解决容器内带interface{}的问题. 但新东西引入, 估计又会让如今的哲学一些凌乱

 

转载请注明: 战魂小筑http://www.cppblog.com/sunicdavy

 

初学Tips

语言学习按照官网的教学走, 跑完基本就会了

下载一个LiteIDE, 配合Golang的Runtime,基本开环境就有了

Golang的类库设计方式和C#/C++都不一样, 若是有Python经验的会感受毫无违和感

有一万个理由造轮子都请住手, 类库里有你要的东西

写大工程请搜索: Golang项目目录结构组织

Golang语言自己本人没有发现bug, 即使有也早就被大神们捉住了. 惟一的一个感受貌似bug的, 常常是结构体成员首字母小写, 可是json又没法序列化出来…

慎用cgo. 官方已经声明将来对cgo不提供完整兼容性. 任何一门语言在早期都须要对C作出支持, 但后期完善后的不兼容都是常态

参考:http://www.cppblog.com/sunicdavy/archive/2015/06/04/210823.html