Golang全接触

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

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

用途篇

Golang到底拿来做啥? 我需要么?

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

编写桌面级UI暂不是很适合

我需要把现在的C++, Python, Erlang等服务器改成Golang么?

性能有瓶颈, 开发效率低, 有钱有时间的话, 完全可以

评价篇

听过太多的人对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

时间: 2024-10-15 16:22:19

Golang全接触的相关文章

ajax全接触

Ajax 全接触 概念介绍 异步: 指某段程序执行时不会阻塞其他程序执行,其表现形式为程序的执行顺序不依赖程序本 身的书写程序,相反则为同步.其优势在于不阻塞程序的执行,从而提升整体执行效率. 实现异步的大致流程: 运用HTML和CSS来实现页面,表达信息 运用XMLHttpRequest和web服务器进行数据的异步交换 运用JavaScript操作DOM,实现动态局部刷新. http:使计算机通过网络进行通信的规则. 是一种无状态的协议.也就是不建立持久的链接. http请求的过程: 建立TC

一种非全接触式导电滚轮

一种非全接触式导电滚轮,属于电子信息设备领域.包括用于使待电镀IC卡封装框架通过的滚轮,滚轮与整流器的负极相连,其特征在于:所述的滚轮(1)上设有相间分布的宽导电接触块(3)与窄导电接触块(4),宽导电接触块(3)与窄导电接触块(4)设在与待电镀IC卡封装框架边缘的导电线相对应的位置.本实用新型的非全接触式导电滚轮只与待电镀IC卡封装框架单位以外的导线部位相接触,不会造成接触面磨伤与划伤. 1.一种非全接触式导电滚轮,包括用于使待电镀IC卡封装框架通过的滚轮(I),滚轮(I)与整流器的负极相连,

一种非全接触式挡液管

一种非全接触式挡液管,属于电子信息设备领域.包括挡液管,挡液管两两相对,之间为待电镀IC卡封装框架,挡液管表面设药水流出口,其特征在于:所述的挡液管(1)上设接触块(3),接触块(3)设在与待电镀IC卡封装框架无铜箔覆盖部分相对应的位置.本实用新型的非全接触式挡液管,将原有的与待电镀IC卡封装框架接触的大部分面积截掉,只与待电镀IC卡封装框架边缘的导电线接触,不会造成有外观要求的接触面磨伤与划伤. 1.一种非全接触式挡液管,包括挡液管(I),挡液管(I)两两相对,两挡液管(I)之间为待电镀IC卡

C#开发Android手机应用全接触(mono for android)

    .NET 也能开发Android手机应用了 (交流学习QQ:1337192913)     分享的这套课程是随风老师的关于C#开发Android手机应用全接触. Mono for Android就是原先的MonoDroid,由于商标问题(名称中含有Droid),现在改名为Mono for Android. Mono for Android提供了一个基于Android的Mono虚拟机,让开发者可以用C#开发Android应用程序.另外,Dalvik API已经被绑定至C#,你可以用C#方便

Orchard模块开发全接触5:深度改造前台第二部分

在这一部分,我们继续完善我们的购物车,我们要做以下一些事情: 1:完成 shoppingcart.cshtml: 2:让用户可以更新数量及从购物车删除商品: 3:创建一个 widget,在上面可以看到商品数量,并且能链接到购物车: 同时,我们会接触到以下技术点: 1:熟悉 IContentManager.GetItemMetadata: 2:通过 IResourceManifestProvider 来包含 resources: 3:使用 KnockoutJS and jQuery,并且应用 MV

Orchard模块开发全接触6:自定义用户注册

我们都知道 Orchard 的用户注册相当简单,现在,我们需要一个自定义的用户注册,现在,开始吧. 一:定义实体 Models/CustomerPartRecord.cs: public class CustomerPartRecord : ContentPartRecord{    public virtual string FirstName { get; set; }    public virtual string LastName { get; set; }    public vir

Orchard模块开发全接触4:深度改造前台

这里,我们需要做一些事情,这些事情意味着深度改造前台: 1:为商品增加 添加到购物车 按钮,点击后功能实现: 2:商品排序: 3:购物车预览,以及添加 结算 按钮: 4:一个显式 购物车中有*个 商品 的widget: 一:添加到购物车 按钮 修改 Views/Parts/Product.cshtml: @{    var price = (decimal)Model.Price;    var sku = (string)Model.Sku;}<article>    Price: @pri

Orchard模块开发全接触2:新建 ProductPart

一:创建 Part 1:项目引用 Orchard.Framework: 2:创建 Models 文件夹: 3:在 Models 文件夹下创建类 ProductPartRecord,如下: public class ProductPartRecord : ContentPartRecord{    public virtual decimal UnitPrice { get; set; }    public virtual string Sku { get; set; } } 注意,为 virt

大数据推荐系统算法代码全接触(企业内训,现场实录,机器学习算法+Spark实现)

[学途无忧网]大数据推荐系统算法代码全接触(企业内训,现场实录,机器学习算法+Spark实现)课程下载:https://pan.baidu.com/s/1piCNIxC2Sv0zMY0yWxY9Ug 提取码:b10v 一.课程简介: 推荐系统是利用电子商务网站向客户提供商品信息和建议,帮助用户决定应该购买什么产品,模拟销售人员帮助客户完成购买过程.个性化推荐是根据用户的兴趣特点和购买行为,向用户推荐用户感兴趣的信息和商品.随着电子商务规模的不断扩大,商品个数和种类快速增长,顾客需要花费大量的时间