问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

go语言设计模式?

发布网友 发布时间:2024-09-08 17:35

我来回答

1个回答

热心网友 时间:2024-11-24 08:53

go语言是什么

Go语言是一种开源的编程语言,被广泛应用于网络编程、云计算、分布式系统等领域。

go语言的三位作者

Go语言的设计目标是成为一种语法简洁、执行效率高、并发性能强大的编程语言。它由Google公司研发,于2009年首次发布,并于2012年成为了开源项目。Go语言具有C语言的表达能力和Python的开发效率,同时还拥有自己独特的语法和特性,如协程、垃圾回收机制等。因此,它被广泛应用于网络编程、云计算、分布式系统等领域,并且越来越受到开发者的青睐。

Go语言的出现,填补了许多编程语言在并发编程方面的空缺。它提供了一种轻量级线程模型,通过协程(goroutine)的方式,实现了高效的并发编程。同时,Go语言还支持内置的网络编程和字节序列编解码库,使得网络编程变得更加容易和高效。在云计算、分布式系统等领域,Go语言也得到了广泛的应用。例如,Docker和Kubernetes等开源项目就是用Go语言开发的。此外,Go语言还具有代码可读性高、编译速度快、编译后的可执行文件体积小等优点,使得它成为了开发高性能、高并发应用的理想语言之一。

为什么要使用Go语言?Go语言的优势在哪里

1.保留但大幅度简化指针

Go语言保留着C中值和指针的区别,但是对于指针繁琐用法进行了大量的简化,引入引用的概念。所以在Go语言中,你几乎不用担心会因为直接操作内寸而引起各式各样的错误。

2.多参数返回

还记得在C里面为了回馈多个参数,不得不开辟几段指针传到目标函数中让其操作么?在Go里面这是完全不必要的。而且多参数的支持让Go无需使用繁琐的exceptions体系,一个函数可以返回期待的返回值加上error,调用函数后立刻处理错误信息,清晰明了。

3.Array,slice,map等内置基本数据结构

如果你习惯了Python中简洁的list和dict操作,在Go语言中,你不会感到孤单。一切都是那么熟悉,而且更加高效。如果你是C++程序员,你会发现你又找到了STL的vector和map这对朋友。

4.Interface

Go语言最让人赞叹不易的特性,就是interface的设计。任何数据结构,只要实现了interface所定义的函数,自动就implement了这个interface,没有像Java那样冗长的class申明,提供了灵活太多的设计度和OO抽象度,让你的代码也非常干净。千万不要以为你习惯了Java那种一条一条加implements的方式,感觉还行,等接口的设计越来越复杂的时候,无数Bug正在后面等着你。

同时,正因为如此,Go语言的interface可以用来表示任何generic的东西,比如一个空的interface,可以是string可以是int,可以是任何数据类型,因为这些数据类型都不需要实现任何函数,自然就满足空interface的定义了。加上Go语言的typeassertion,可以提供一般动态语言才有的cktyping特性,而仍然能在compile中捕捉明显的错误。

5.OO

Go语言本质上不是面向对象语言,它还是过程化的。但是,在Go语言中,你可以很轻易的做大部分你在别的OO语言中能做的事,用更简单清晰的逻辑。是的,在这里,不需要class,仍然可以继承,仍然可以多态,但是速度却快得多。因为本质上,OO在Go语言中,就是普通的struct操作。

6.Goroutine

这个几乎算是Go语言的招牌特性之一了,我也不想多提。如果你完全不了解Goroutine,那么你只需要知道,这玩意是超级轻量级的类似线程的东西,但通过它,你不需要复杂的线程操作锁操作,不需要care调度,就能玩转基本的并行程序。在Go语言里,触发一个routine和erlangspawn一样简单。基本上要掌握Go语言,以Goroutine和channel为核心的内存模型是必须要懂的。不过请放心,真的非常简单。

7.更多现代的特性

和C比较,Go语言完全就是一门现代化语言,原生支持的Unicode,garbagecollection,Closures(是的,和functionalprogramminglanguage类似),function是firstclassobject,等等等等。

看到这里,你可能会发现,我用了很多轻易,简单,快速之类的形容词来形容Go语言的特点。我想说的是,一点都不夸张,连Go语言的入门学习到提高,都比别的语言门槛低太多太多。在大部分人都有C的背景的时代,对于Go语言,从入门到能够上手做项目,最多不过半个月。Go语言给人的感觉就是太直接了,什么都直接,读源代码直接,写自己的代码也直接。

为什么要使用Go语言,Go语言的优势在哪里

部署简单。Go编译生成的是一个静态可执行文件,除了glibc外没有其他外部依赖。这让部署变得异常方便:目标机器上只需要一个基础的系统和必要的管理、监控工具,完全不需要操心应用所需的各种包、库的依赖关系,大大减轻了维护的负担。这和Python有着巨大的区别。由于历史的原因,Python的部署工具生态相当混乱【比如setuptools,distutils,pip,

buildout的不同适用场合以及兼容性问题】。官方PyPI源又经常出问题,需要搭建私有镜像,而维护这个镜像又要花费不少时间和精力。

并发性好。Goroutine和channel使得编写高并发的服务端软件变得相当容易,很多情况下完全不需要考虑锁机制以及由此带来的各种问题。单个Go应用也能有效的利用多个CPU核,并行执行的性能好。这和Python也是天壤之比。多线程和多进程的服务端程序编写起来并不简单,而且由于全局锁GIL的原因,多线程的Python程序并不能有效利用多核,只能用多进程的方式部署;如果用标准库里的multiprocessing包又会对监控和管理造成不少的挑战【我们用的supervisor管理进程,对fork支持不好】。部署Python应用的时候通常是每个CPU核部署一个应用,这会造成不少资源的浪费,比如假设某个Python应用启动后需要占用100MB内存,而服务器有32个CPU核,那么留一个核给系统、运行31个应用副本就要浪费3GB的内存资源。

良好的语言设计。从学术的角度讲Go语言其实非常平庸,不支持许多高级的语言特性;但从工程的角度讲,Go的设计是非常优秀的:规范足够简单灵活,有其他语言基础的程序员都能迅速上手。更重要的是Go自带完善的工具链,大大提高了团队协作的一致性。比如gofmt自动排版Go代码,很大程度上杜绝了不同人写的代码排版风格不一致的问题。把编辑器配置成在编辑存档的时候自动运行gofmt,这样在编写代码的时候可以随意摆放位置,存档的时候自动变成正确排版的代码。此外还有gofix,

govet等非常有用的工具。

执行性能好。虽然不如C和Java,但通常比原生Python应用还是高一个数量级的,适合编写一些瓶颈业务。内存占用也非常省。

Go语言channel的阻塞问题

Hello,大家好,又见面了!上一遍我们将channel相关基础以及使用场景。这一篇,还需要再次进阶理解channel阻塞问题。以下创建一个chan类型为int,cap为3。

channel内部其实是一个环形buf数据结构,是一种滑动窗口机制,当make完后,就分配在Heap上。

上面,向chan发送一条“hello”数据:

如果G1发送数据超过指定cap时,会出现什么情况?

看下面实例:

以上会出现什么,chan缓冲区允许大小为1,如果再往chan仍数据,满了就会被阻塞,那么是如何实现阻塞的呢?当chan满时,会进入gopark,此时G1进入一个waiting状态,然后会创建一个sudog对象,其实就sendq队列,把200放进去。等buf不满的时候,再唤醒放入buf里面。

通过如下源码,你会更加清晰:

上面,从chan获取数据:

Go语言核心思想:“Donotcommunicatebysharingmemory;instead,sharememorybycommunicating.”你可以看看这本书名叫:EffectiveGo

如果接收者,接收一个空对象,也会发生什么情况?

代码示例:

也会报错如下:

上面,从chan取出数据,可是没有数据了。此时,它会把接收者G2阻塞掉,也是和G1发送者一样,也会执行gopark将状态改为waiting,不一样的点就是。

正常情况下,接收者G2作为取出数据是去buf读取数据的,但现在,buf为空了,此时,接收者G2会将sudog导出来,因为现在G2已经被阻塞了嘛,会把G2给G,然后将t:=-ch中变量t是在栈上的地址,放进去elem,也就是说,只存它的地址指针在sudog里面。

最后,ch-200当G1往chan添加200这个数据,正常情况是将数据添加到buf里面,然后唤醒G2是吧,而现在是将G1的添加200数据直接干到刚才G2阻塞的t这里变量里面。

你会认为,这样真的可以吗?想一想,G2本来就是已经阻塞了,然后我们直接这么干肯定没有什么毛病,而且效率提高了,不需要再次放入buf再取出,这个过程也是需要时间。不然,不得往chan添加数据需要加锁、拷贝、解锁一序列操作,那肯定就慢了,我想Go语言是为了高效及内存使用率的考虑这样设计的。(注意,一般都是在runtime里面完成,不然会出现象安全问题。)

总结:

chan类型的特点:chan如果为空,receiver接收数据的时候就会阻塞等待,直到chan被关闭或者有新的数据到来。有这种个机制,就可以实现wait/notify的设计模式。

相关面试题:

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 呼伦贝尔油玉不绝电子商务有限公司怎么样? 如何避免wps卡顿? 属鼠的男人找对象是属什么,属鼠的人和什么属相合 96年鼠的姻缘在哪年 属相相合年份运势提升 2024属鼠找对象属什么最佳 黑客攻击网站能报案吗 谁知到皇马队员在场上用什么语言交流,如果是西班牙语 新注册的工作室 税务方面的问题 公司每个月扣我两千多税,但是社保只交最低标准合法吗 你觉得快乐大本营和你好星期六有什么区别? 北京高考平均成绩多少? 怎么关闭微信的分付? 豆腐和丝瓜一起吃行吗 我便秘刚好,马上就吃了零食,每天6包+9个火腿肠,这样子会不会再次便秘... 多吃零食会让身体舒服,是真的么? 大学计算机基础实验与上机考试教程适合自学吗? 大学计算机基础教程习题解答与实验指导内容简介 大学计算机基础简明教程百科名片 大学计算机基础教程图书信息(三) 大学计算机基础上机指导与习题集基本信息 大学计算机基础图书信息(五) 水龙头断丝,买了断丝取出器,但是取出器也卡死了取不出来怎么办 如何拧开水龙头嘴 lol游戏鼠标哪个好 玩lol鼠标哪个好 lol鼠标哪个好 golang前景怎么样? 厦门大学分数线到了可以被收吗 教教怎样弄一个软件的推广安装包上传到群文件中,上传到群文件就免教... 涉嫌是什么意思涉嫌寓意 哨子寓意是什么意思? 木工装修小区门框包边怎么弄? Zach是什么意思,有什么寓意吗? 不锈钢门框怎么包 看寓意是什么意思? petrichor是什么意思, petrichor的寓意是什么 安卓手机如何设置拦截陌生号码 类似金毛的是什么狗 嘉兴适合晚上游玩地方推荐,嘉兴旅游点推荐 求问狗狗品种,有点像金毛的体型,但是比金毛大,毛色有点像苏牧,黑白金相... 大姨妈血块怎么办 这几个月大姨妈都不正常,有时候一个月来2次 血上厕所时多,哗一下流_百... 钢链式cvt优缺点 工厂厨房工程设计要注意什么 军工etf什么意思 军工ETF是什么股