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

现在这个时代似乎吹牛都不用打草稿,画饼已成为常态,搬个砖都敢说自己是工程师,会敲个“Hello
World!”的都说自己是程序员。程序员真的是那么好入行的吗? Daisuke
Maki认为成为一个真正的程序员并不是件易事,以Go语言为例,想成为一个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语言程序员了!

本文作者:佚名

来源:51CTO

时间: 2024-09-27 05:48:52

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

运行错误-求c语言大神帮忙看看哪里出错了

问题描述 求c语言大神帮忙看看哪里出错了 #include #include #include struct course { int num; //选题编号 char name[20];//课题名称 char kind[10];//课程性质 int taltime,ttime,etime,mark,term;//课程时间,学分,开课信息 }; struct student { int snum; //学生学号 int cnum; //所选课题编号 char cname[20];//所选课题名称

指针-@C语言大神,这程序谭浩强给的答案看不懂,求解释?

问题描述 @C语言大神,这程序谭浩强给的答案看不懂,求解释? //题目:输出字符串里数字团,以及个数.比如89cy129//就输出89,129,一共2个数.// 问题:后面一大段为啥要复制粘贴前面一大段的代码?//有什么用?求解释.而且运行也不对,求修改!跪谢! include int main() { char str[80],*pstr; int m,i=0,j=0,k=0,digit=0,ndigit=0,e10,a[80],*pa; pstr=&str[0];pa=&a[0]; g

c-求助C语言大神! 二叉排序树

问题描述 求助C语言大神! 二叉排序树 求用C实现:输入初始关键字序列,构造一个二叉排序树. 谢谢!不用C++ 解决方案 // 二叉树_C.cpp : 定义控制台应用程序的入口点.//#include ""stdafx.h""#include ""malloc.h""#define MAX 1240typedef struct bitnode{ char data; struct bitnode *lchild*rchild;

c语言-求问C语言大神,帮忙看一下这道题~~

问题描述 求问C语言大神,帮忙看一下这道题~~ 分离单词 Description 编写程序以字符串为单位,以空格或标点符号(字符串中仅含英文逗号','或小数点'.'作为标点符号)作为分隔符,对字符串中所有单词进行倒排,然后把已处理的字符串(应不含标点符号)打印出来. Input 输入一个字符串(包含大小写字母.空格.逗号或小数点) Output 输出处理后的字符串. Sample Input I am a student. I like study. Sample Output study li

java-求教各位Java程序语言大神,用Java语言编写一个能在Eclipse开发工具运行的音乐播放器

问题描述 求教各位Java程序语言大神,用Java语言编写一个能在Eclipse开发工具运行的音乐播放器 这个音乐播放器要有基本的功能,例如(这几个播放方式最好有图标)开始播放.停止播放.两三个播放模式:音乐播放的进度条:播放列表:有歌手的背景图. 最后一个要求:编程能在Eclipse开发工具了运行. 本人新手,对Java语言很多不懂,所以如果可以的话,可以在某些关键的代码后面注释,谢谢! 也可以发到我邮箱:sxl2860@163.com,如果是发到我邮箱的,请大神们说一声! 如果做得好的话,及

对象-@C语言大神:此题不用C++能做吗?求算法思路??【不要求代码】

问题描述 @C语言大神:此题不用C++能做吗?求算法思路??[不要求代码] 求:同日出生的人的总个数,请使用面向对象的方法,找出若干同学中,生日相同的学生总数. 提示: 1.定义类表示日期,包含私有属性年月日,重载等于操作符,用于大小比较 2.定义类表示学生,包含私有属性姓名.生日(日期类型) 输入:四个学生对象的信息,分别是姓名,年,月,日 比如 XiaoZhang 1994 5 1 XiaoWang 1994 5 1 XiaoLi 1994 6 3 XiaoChen 1994 6 3 输出

malloc-@C语言大神,按序号i查找链表中的元素,第46行为啥有断点错误~~???求解释

问题描述 @C语言大神,按序号i查找链表中的元素,第46行为啥有断点错误~~???求解释 include include typedef struct Node { char data; struct Node *next; }Node,*Linklist; Linklist Createfromhead()//建立链表 { Linklist L;Node*s;int flag=1;char c; L=(Linklist)malloc(sizeof(Node)); L->next=NULL; w

c-萌妹纸@C语言大神,学科平均分用结构体,此题跪求代码?

问题描述 萌妹纸@C语言大神,学科平均分用结构体,此题跪求代码? 题目: 班里10名同学,选修物理和数学的同学各有若干名. 现在录入同学学号,姓名,选修课程编号,以及其成 绩, 要求计算出物理.数学课程的平均分,各成绩段学 生数和比例,最高分及学生信息. 其中,分数(含平均分)都按百分制(整数处理) ,比例按浮点数处理,精确到小数点后两位.平均 分取整时按四舍五入处理,例如,74.5,四舍五入为 75.最高分可能有多个.(要求,分别建立班级类 ,课程类.班级类包含所有学生信息,课程类实例为 物理

请各位大神帮我用java编一下这个程序吧...我一点头绪都没有...

问题描述 请各位大神帮我用java编一下这个程序吧...我一点头绪都没有... 这道题的答案是:x=1.364746094 解决方案 http://wenku.baidu.com/link?url=wjIO2baxEfcSucwWaY_acszu0735F0QeyzjGf-Vrkr6R0xLvWnExVQSjPHb-4AX541nAiEoAaJGrH7V2aGTaoURkYFxRmydDCzkk5XcVgTShttp://download.csdn.net/detail/u012724893/8