Go语言大神亲述:历七劫方可成为程序员!

“历劫1”:你坚信你可以用Go来做面向对象编程?

在经历了一次Go应用之旅之后,你可能就会开始思考:“怎么样才能让这种语言更像面向对象的编程语言?”因为你已经习惯了这种编程,你想要制作健壮的代码、想要多态。

然后,你说:“一定有办法实现的!”再然后,你就发现了结构嵌入,它可以将来自封闭对象的方法巧妙的委托给嵌入对象,而无需重复代码。这简直是太伟大了!

当然,很快你就会发现这并不能真正解决问题。因为结构嵌入只允许委派方法调用,所以看起来你是在做多态方法调度,但关系并不是IS-A,而是HAS-A,方法调用的接收方不是封闭对象,而始终是委托方法调用的嵌入对象。

所以,你明白了不要试图在Go中进行面向对象的编程?

“历劫2”:你相信goroutines会解决所有的问题?

在使用之前,你曾被“通过goroutines可以轻松运行并发代码”所蛊惑,你所要做的就是使用Go关键字,同时运行所有函数或者方法调用。这时你自然就会想到通过让代码并发运行来最大限度地提高代码的效率。通过函数调用自动创建goroutines,甚至调用者都没有意识到。没错儿,它的确做到了所有代码都在同时运行,但是它让代码变得更复杂了。

Go允许用户创建数百万的goroutine,而且不会牺牲太多的效率,那么你真的应该使用goroutine吗?你要知道并行代码相比在单线程中流动的代码而言,是更加难以维护和调试对的。一次从多个goroutine访问时,你要考虑共享对象是否正确同步?执行顺序是否绝对正确? goroutine是否在不再需要时实际退出了?

所以,goroutine并不是万能的,一定要在必要的时候使用,而且尽量不要在用户的后面使用goroutine。

并且因为您通过使您的函数调用自动创建goroutines来隐藏此事实,因此调用者甚至不需要意识到这一点。

“历劫3”:你认为接口将代替面向对象编程解决所有的问题?

在你终于意识到对象无法使用多态之后,突然想到了可以利用接口提供的功能,接口支持API,所以可以使用它来编写更健壮的代码。

所以现在当你编写库时,定义了所有的接口,只导出接口并具有私有结构,以便封装成perrrrfect。它还为你提供了更多的灵活性来切换底层实现,因为现在你已成功地将API与其实现分离。

接口虽然给予了你很大的权力,但它不是一个终极解决方案。在面向对象编程中,它仍然没有提供真正的多态性,而且你也要受到接口只能定义API的限制,无法将所有数据与其相关联。

当然,在某种场景下只导出接口是有意义的,当代码量比较小的时候,接口是很好的方法。但是如果在代码量大的时候,你不得不额外再多编写大量的代码。

如果想要最大限度的利用接口,可以在某些类型互换时使用。

“历劫4”:你相信channel可以解决所有问题?

在你历经曲折,尝试了多种方法曲线救国无果之后,也许某一天灵光一闪,“等等,还有channel。”

Channel隐式处理并发访问,你相信通过channel可以巧妙的来处理同步、返回值以及使用各种channel的select语句来进行流量控制。

没错,channel是很有用的,和你的初衷也是相符的,它提供了一个在goroutine之间传递值的原语。但是,慢慢你就会发现使用channel的Go语言会出现很多问题,例如超时、阻塞I / O,同步问题等。

所以,你要明白channel是很简洁的结构,但是如果滥用它会导致更复杂、难以调试的代码。

“历劫5”:“哼哼,Go语言也一般般嘛,哪有大家说的那么强大”

“为什么?到底是为什么?写Go代码实在是太痛苦了,它一直不允许我按照自己的方式来写。”在尝试了各种方法之后,你发现它们都不能解决多态性和并发性的问题,你甚至开始怀疑Go语言存在的合理性,你觉得你被剥夺了其它语言提供的所有好的结构和工具。

你认为用更有力的工具来表达抽象思想是绝对有必要的,而Go只是没有削减它。

但是,你忘记了,所有的语言都是有限制性的,你不能只是一味的想要语言按照你的想法来运行,而不考虑当初作者设计这门语言的初衷。

“历劫6”:你开始意识到前面5个阶段其实都是你在想象

到了这个阶段,你基本上就放弃了各种小聪明的做法,决定根据大多数标准库的写法来编写Go代码。

这时候你还是有这么一个想法:我不想接受Go语言的方法。但是这个时候,一切就开始变得有趣了。

在我不得不放弃面向对象编程,从而拥抱Go语言的同时,也不得不接受一个事实,编写并发代码实在是太难了。我始终坚信语言的重点是让程序员编写更简洁的代码,所以,一门语言它要足够编写执行复杂的代码,但是通过删除某些关键工具,让最终编写的代码更简单。

“历劫7”:羽化成仙

到了这个阶段,你已经完全接受了Go,你可以用Go来编写所有的内容,包括Perl / Ruby / Python的内容。你开始意识到再也没有错误困扰着你;你必须使用goroutines和channel,

因为你是Gopher;你会感到荣幸,Go语言竟然允许你这样来编写代码。

恭喜,现在你已经是一名Go语言程序员了!

时间: 2024-08-29 20:18:44

Go语言大神亲述:历七劫方可成为程序员!的相关文章

Java大神进阶之路!每一位程序员值得借鉴!

既然励志在java路上走的更远,那就必须了解java的路径.先看图 更加细化的细节如下 一: 编程基础 不管是C还是C++,不管是Java还是PHP,想成为一名合格的程序员,基本的数据结构和算法基础还是要有的.下面几篇文章从思想到实现,为你梳理出常用的数据结构和经典算法. 1-1 常用数据结构 数组.链表.堆.栈.队列.Hash表.二叉树等 1-2 算法思想 算法时间复杂度和空间复杂度的分析计算 算法思想:递推.递归.穷举.贪心.分治.动态规划.迭代.分枝界限 1-3 经典算法 经典排序:插入排

初学者:简单的租车程序(敲了一晚)(想大神看看,为啥我一个简单的程序要敲这么多,可以怎么改进?)

/** * 创建一个接口实现租凭方法 * */package com.lxl.car; public interface Rent { void rent(int day,int num);} /** * 定义一个抽象的汽车类 属性:颜色,型号 ,租车的价格 * */package com.lxl.car; public abstract class Car implements Rent{ //构造方法 public Car(){} private String size;// 型号 priv

北京上海Cloudera Hadoop大数据培训:CCAH(管理员)、CCA(程序员)

北京上海Cloudera Hadoop大数据培训:CCAH(管理员).CCA(Spark and Hadoop) 北京9月27-30日Cloudera  Administrator Training for Apache Hadoop(CCAH) 上海9月27-30日Cloudera  Administrator Training for Apache Hadoop(CCAH) 北京10月17-20日Cloudera Data Analyst Training 上海10月27-30日Cloude

挨踢部落故事汇(20):Android程序员的十大转型之路

玖哥是一个来自东北的Android攻城狮,现在定居被誉为"大湖名城,创(chuan)新(xiao)高地"的合肥.知识面极广,不仅广泛涉猎IT相关知识,还热爱文学,性格幽默,被誉为"会搞Android的段子手".他还是一个藏书人士,拥有汗牛充栋的IT书籍,而且每本书都认真阅读过,从不拿书当摆设. 玖哥·Android攻城狮 先说说Android程序员不可能转型的几个方向,以下四个不靠谱方向的靠谱性递减: 首先不会转型iOS,iOS和Android工程师的工作内容都是大

【绝对干货】Swift是花拳绣腿吗?从Swift谈开发语言与程序员的职业发展

Swift是一种新的编程语言,用于编写 iOS 和 OS X 应用.Swift 结合了 C 和 Objective-C 的优点并且不受C兼容性的限制.Swift 采用安全的编程模式并添加了很多新特性,这将使编程更简单,更灵活,也更有趣.我们的腾讯Bugly移动开发者沙龙第二期就是围绕这一主题展开的,很多同学表示听的不够过瘾,因此小编特意邀请分享者将精华整理成文字,来于大家分享. 首先我们考察一下Swift究竟是一个什么样的变成语言.在2014年苹果的WWDC(世界开发者大会)上,Swift首次亮

越来越多的Java程序员转行Java大数据...

JAVA的精密,强大,拥有其它语言不可替代的性能和可维护性,早已经是成为最受欢迎的编程语言之一,很多人想进入IT行业,首选的第一门语言就是JAVA. 但是,在未来肯定是大数据的天下,人工智能的爆发,将会有大量企业会进入大数据领域,从而产生大量的大数据人才需求. 据最新发布的<大数据人才报告>显示,目前全国的大数据人才仅46万,未来3-5年内大数据人才的缺口将高达150万.领英报告表明,数据分析人才的供给指数最低,仅为0.05,属于高度稀缺.数据分析人才跳槽速度也最快,平均跳槽速度为19.8个月

程序员修神之路--做好分库分表其实很难之一(继续送书)

菜哥,领导让我开发新系统了 这么说领导对你还是挺信任的呀~ 必须的,为了设计好这个新系统,数据库设计我花了好多心思呢 做一个系统我觉得不应该从数据库入手,应该从设计业务模型开始,先不说这个,说说你的数据库设计的优势 为了高性能我首先设计了分库 分表策略,为以后打下基础 那你的数据量将来会很大吗?分库分表其实涉及到很多难题,你了解过吗? 我觉得分库分表很容易呀 是吗? 是否需要分 说到数据库分库分表,不能一味的追求,我们要明白为什么要进行分库分表才是最终目的.现在网上一些人鼓吹分库分表如何应对了多

程序员的十大任务,你完成了吗?

新的一周,你有没有给自己定好本周的任务?但是,作为程序员,你知道你必须完成的十大任务,看看你完成了没有? 程序员最艰巨的任务跟编写代码没有多少关系.编码是逻辑思路的一种实践,这跟程序员日常工作中的其它任务比起来相对简单.如果你认为自己还是一个水平一般的程序员,在你真正的能进入到高手行列前,请确保你已经克服了下列晋级的障碍. 1. 解释你在干什么 解释软件开发过程是一个很困难的事情.那些非程序员职业的人也许知道很多关于编程的事情,但很显然,他们不会编程.对于他们来说,我们的生活就是在一间黑暗的屋子

理解C#语言中的类型转换----初学者的理解,请大神指教

一下都是在视频教学中学到后的理解,如果说错了请大神指教 C#语言中的类型转换,就是将某个数据要转换成另一个类型的数据. c#语言中的数据类型主要有: char类型(字符类型): string类型(字符串类型): int类型(整数类型): double类型(小数类型): 类型转换主要分为三种: 1:任意类型转换为string类型: 转换代码书写格式为:待转换的数据.Tostring(): a,这里的待转换的数据指的是需要转换的数据或变量.后面的Tostring():是固定书写. 转换完成后的返回类