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语言程序员了!
Go语言大神亲述:历七劫方可成为程序员!的更多相关文章
- C语言过时了?为什么还要推荐每一位程序员都来学一下C语言?
互联网蓬勃发展的时代,有一类人做出了巨大的贡献,这一群人被大家称之为程序员,怎样才能成为一名优秀的程序员呢,为什么每一个程序员都需要学习C语言呢? 就让我来跟大家分享分享: 在学习C/C++或者想 ...
- 移动端开发语言的未来的猜想#华为云·寻找黑马程序员#【华为云技术分享】
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...
- 敏捷史话(七):从程序员、作家到摇滚乐手——Andy Hunt的多面人生
与其说 Andy Hunt 是敏捷宣言的创始人,不如说他是一名专业作家来得更为合适.他的<实用程序员><程序员修炼之道:从小工到专家><编程 Ruby:实用程序员指南&g ...
- 最详细的vue-cli安装教程 &^没有之一 ^& 大神亲测。。╮( ̄▽  ̄)╭
这里介绍使用git安装,电脑自带命令行依然可以使用进行安装 第一步 node环境安装 1.1 如果本机没有安装node运行环境,请下载node 安装包进行安装 1.2 如果本机已经安装node的运行换 ...
- 新手求大神,有其他swit-case的思路写这个程序么?
两个程序: switch-case与if-else if的区别相同点:可以实现多分支结构;不同点:switch:一般只能用于等值比较.(可以进行范围运算???---学会用switch计算范围出炉的思路 ...
- 求C#开发大神指点职业规划或者开发路数(以后怎么走),谢谢
背景:作为一名Asp.net Web类的开发人员,工作时间有点长,5年不到,属于是天赋不太强,但是比较努力型的人,开发过程中那事情基本上都会,各种前后端框架也会使用.目前在研究分布式缓存应用 Memc ...
- python目标定位(借鉴csdn上大神)
写博客是为了记录下来,毕竟好多东西记不住,看过就忘了,收藏又太多,还不如搬运到自己博客下面,随时可翻~~~ 近期再学目标识别与定位,看着原理都很简单,但是真自己做,又觉得困难重重. csdn上一个大神 ...
- Atitit.dart语言的特性 编译时js语言大总结
Atitit.dart语言的特性 编译时js语言大总结 1. 原型环境1 1.1. Dart可以编译js3 2. 第二个期待的理由是Dart的语言特性,没有什么特别特性好像,类似java c#一小时 ...
- C语言简单实现链栈基本几个功能(适合新手看,大神可指正)
接着上一次的顺序栈,今天我记一下链栈,因为我也是刚学不久,有些地方也稍稍理解不了,所以,一起共勉.我会用我自己结合教材上画的图,争取跟代码一起结合,用文字和图最大化的解释代码,这样的话 ...
随机推荐
- 【题解】51nod1327 棋盘游戏
那天和机房的同学们一起想了很久,然而并没有做出来……今天看了题解,的确比较巧妙,不过细细想来其实规律还是比较明显,在这里记录一下~ 当天自己做的时候,主要想到的是两点 : 1.按列dp 2.对行进行排 ...
- Linux实验二
一 第一个实验 Linux基础 1 通过娄老师关于分析学霸学渣的前言 明白了真正的学习一门功课应该是思考本质 而不是纯属记忆 2 全部的命令如下 Linux命令格式:command [o ...
- PC蓝牙通信C#代码实现
PC蓝牙通信C#代码实现 这篇文章主要为大家详细介绍了PC蓝牙通信C#代码实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了C#实现PC蓝牙通信代码,供大家参考,具体内容如下 ...
- Bigbluebutton服务执行过程及相关配置文件
BigBlueButton服务列表 BigBlueButton由许多开源的服务组成,看似很麻烦,实际上拆分开每一个服务就很简单了,组件化平台化.究竟BBB都用到了哪些开源服务?我们来列举一下,名称均带 ...
- [Jenkins 新插件] 兼容阿里开发手册 (P3C) 的火线插件安装使用教程
一.前言 火线(Fireline)的Jenkins官方插件已经上线,目前火线不仅能检查出安卓代码中的安全类问题和内存泄露问题,还兼容了阿里开源的Java开发规约(P3C项目),本文将以教程的形式帮助大 ...
- 在IIS中寄存服务
http://blog.csdn.net/songyefei/article/details/7381595 第三篇 在IIS中寄宿服务 通过前两篇的学习,我们了解了如何搭建一个最简单的WCF通信模型 ...
- 洛谷 P1976 鸡蛋饼
题目背景 Czyzoiers 都想知道小 x 为什么对鸡蛋饼情有独钟.经过一番逼问,小 x 道出 了实情:因为他喜欢圆. 题目描述 最近小 x 又发现了一个关于圆的有趣的问题:在圆上有2N 个不同的点 ...
- C11性能之道:右值引用
1.左值与右值 C++11中新增了一种类型,右值引用,标记为T &&. 首先来介绍什么是左值和右值,左值是指表达式结束后依旧存在的持久对象,而右值是指表达式结束之后就不再存在的临时对象 ...
- 超详细的Java面试题总结(三)之Java集合篇常见问题
List,Set,Map三者的区别及总结 List:对付顺序的好帮手 List接口存储一组不唯一(可以有多个元素引用相同的对象),有序的对象 Set:注重独一无二的性质 不允许重复的集合.不会有多个元 ...
- 关于SQL注入的五大报错注入函数
~全部都以查user()为例子~ 1.floor()id = 1 and (select 1 from (select count(*),concat(version(),floor(rand(0) ...