所在的位置: C++ >> C++前景 >> 从C到GO

从C到GO

北京中科医院都是假的 https://yyk.99.com.cn/fengtai/68389/
并发编程Go语言层面支持协程,将并发业务逻辑从异步转为同步,大幅提高开发效率;在c++中,做并发编程目前主流的方案是事件驱动(单线程/多线程/多进程模型等),而事件驱动就需要一个IO多路复用的分发器(select/epoll),这样,就造成了业务逻辑的断开,在代码层面为异步模型,比如:1).先是一段业务代码2).调用IO(业务断裂)3).IO完成后的后续处理逻辑;而go中的协程的支持让这样的开发工作就轻松多了,按照同步的方式顺序写业务逻辑,遇到IO也没关系,一个线程中可以创建成上百万个协程,这个协程阻塞了就跑下一个,不需要应用代码层面来负责IO后续调度的处理;比起自己用C/C++去封装底层或调用libevent之类的库,Go的优势是将事件机制封装成了CSP模式,编程变得方便了,但是需要付出goroutine调度的开销;垃圾回收毫无疑问这个好用,有了垃圾回收,不需要开发者自行控制内存的释放,这样可避免一堆问题(重复释放、忘记释放内存、访问已释放的内存等);当然,c++11引入的智能指针(unique_ptr等)如果在程序中应用的普遍,也可以达到类似垃圾回收的目的;GC带来的问题也是有的,会造成STW,会有程序停止调度的卡顿;Go1.5的GC利用各种手段大大缩减了STW的时间。Go语言官方保证,在50毫秒的Go程序运行时间中因GC导致的调度停顿至多只有10毫秒。函数多返回值这在python里算不得什么新鲜事,但对c++来说,要实现函数返回多个数据,要么封装一个结构体,要不就只能通过函数传参实现;多返回值这玩意,在码字的时候能提升心情愉悦感啊,想想,在要返回多个值的场景,不用再找个地方用一个结构体封装一下,直接返回,多直接:

funcgetName()(firstName,middleName,lastName,nickNamestring){return"May","M","Chen","Babe"}错误处理提到多返回值,就接着说说错误处理,估计多返回值应用最多的场景就是第二个参数传回函数的错误状态;比如以下写法就很常见了:

ifresult,ok:=moreMagic();ok{/Dosomethingwithresult/}

c/c++对错误的处理一般都是通过错误码来确定一个函数是否正确调用,因此相比c/c++而言,go的错误处理代码行减少了,看上去也美观优雅;

go引入了3个关键字(defer、panic和recover)用于标准的错误处理流程;defer关键字的引入,保证错误处理的代码在发现错误时一定能够被调用,不会因为业务分支逻辑上的修改而漏调;

当然,看和谁比了,python的实践者认为没有使用trycatch的异常处理机制,让错误处理显得很繁琐;

RussCox指出Go语言是为大型软件设计的,Go语言的返回错误方式,不可否认,对于调用者不是很方便,但这样做会让程序中可能会出错的地方显的很明显。对于小程序来说,你可能只想打印出错误,退出程序。对于一些很精密的程序,根据异常的不同,来源的不同,程序会做出不同的反应,这很常见,这种情况中,try+catch的方式相对于错误返回模式显得冗长。

函数的地位提升函数作为“类型”出现,成为了一等公民;可以定义函数类型,将一个函数赋值给函数变量,然后在业务链中传递,这个在c++中只有使用std::function才能做到;还可以使用匿名函数(对应c++11中的lambda表达式),在语言层面支持函数编程,从而可以对程序进行更加灵活的控制和管理。强制的编码规范系统做大做久了,代码质量难免下降;开发人员的代码风格不一致,导致程序中充斥着千奇百怪的命名及类的组织方式;是的,是个公司就会有代码规范,但那只是写在纸面上的东西,是否真照着执行了,还真不好说;什么后期扫描,不改不给上线?为工程而生,go强制的编码规范,让人耳目一新,从命名、到代码排列组织方式都有明确的规定,不符合就不能编译通过!这个真得叫好;代码工程不是实现个性张扬的地方;哲学Go语言集众多编程范式之所长,并以自己独到的方式将它们融合在一起。程序员们可以用他们喜欢的风格去设计程序。相对于设计规则上的灵活,Go语言有着明确且近乎严格的编码规范。我们可以通过“gofmt”命令来按照官方的规范格式化代码。Go语言是强调软件工程的编程语言。它自带了非常丰富的标准命令,涵盖了软件生命周期(开发、测试、部署、维护等等)的各个环节。Go语言是云计算时代的编程语言。它


转载请注明:http://www.aierlanlan.com/cyrz/413.html