一文让你知道为什么学了PHP的都要转学Go语言( 二 )


基于消息传递的通信方式

一文让你知道为什么学了PHP的都要转学Go语言

文章插图
 
在异步的并发编程过程中,只能方便、快速的启动协程还不够 。协程之间的消息通信,也是非常重要的一环,否则,各个协程就会成为脱缰的野马而无法控制 。在GO语言中,使用基于消息传递的通信方式(而不是大多数语言所使用的基于共享内存的通信方式)进行协程间通信,并且将消息管道(channel)作为基本的数据类型,使用类型关键字(chan)进行定义,并发操作时线程安全 。这点在语言的实现上,也具有革命性 。可见,GO语言本身并非简单得没有底线,恰恰他们会将最实用、最有利于解决问题的能力,以最简单、直接的形式提供给用户 。
Channel并不仅仅只是用于简单的消息通信,还可以引申出很多非常实用,而实现起来又非常方便的功能 。比如,实现TCP连接池、限流等等,而这些在其它语言中实现起来并不轻松,但GO语言可以轻易做到 。
一文让你知道为什么学了PHP的都要转学Go语言

文章插图
 
GO语言作为编译型语言,在数据类型上也支持得非常全面,除了传统的整型、浮点型、字符型、数组、结构等类型外 。从实用性上考虑,也对字符串类型、切片类型(可变长数组)、字典类型、复数类型、错误类型、管道类型、甚至任意类型(Interface{})进行了原生支持,并且用起来非常方便 。比如字符串、切片类型,操作简便性几乎和Python类似 。
另外,将错误类型(error)作为基本的数据类型,并且在语言级别不再支持try…catch的用法,这应该算是一个非常大胆的革命性创举,也难怪很多人吐槽GO语言不伦不类 。但是跳出传统的观念,GO的开发者认为在编程过程中,要保证程序的健壮性和稳定性,对异常的精确化处理是非常重要的,只有在每一个逻辑处理完成后,明确的告知上层调用,是否有异常,并由上层调用明确、及时的对异常进行处理,这样才可以高程度的保证程序的健壮性和稳定性 。虽然这样做会在编程过程中出现大量的对error结果的判断,但是这无疑也增强了开发者对异常处理的警惕度 。而实践证明,只要严格按GO推荐的风格编码,想写出不健壮的代码,都很难 。当然,前提是你不排斥它,认可它 。
一文让你知道为什么学了PHP的都要转学Go语言

文章插图
 
在语言中支持函数多返回值,并不是什么新鲜事,Python就是其中之一 。允许函数返回多个值,在某些场景下,可以有效的简化编程 。GO语言推荐的编程风格,是函数返回的最后一个参数为error类型(只要逻辑体中可能出现异常),这样,在语言级别支持多返回值,就很有必要了 。
Defer延迟处理机制
一文让你知道为什么学了PHP的都要转学Go语言

文章插图
 
在GO语言中,提供关键字defer,可以通过该关键字指定需要延迟执行的逻辑体,即在函数体return前或出现panic时执行 。这种机制非常适合善后逻辑处理,比如可以尽早避免可能出现的资源泄漏问题 。
可以说,defer是继goroutine和channel之后的另一个非常重要、实用的语言特性,对defer的引入,在很大程度上可以简化编程,并且在语言描述上显得更为自然,极大的增强了代码的可读性 。
一文让你知道为什么学了PHP的都要转学Go语言

文章插图
 
Golang作为强类型的编译型语言,灵活性上自然不如解析型语言 。比如像php,弱类型,并且可以直接对一个字符串变量的内容进行new操作,而在编译型语言中,这显然不太可能 。但是,Golang提供了Any类型(interface{})和强大的类型反射(reflect)能力,二者相结合,开发的灵活性上已经很接近解析型语言 。在逻辑的动态调用方面,实现起来仍然非常简单 。既然如此,那么像PHP这种解析型语言相比于GO,优势在那里呢?就我个人而言,写了近10年的PHP,实现过开发框架、基础类库以及各种公共组件,虽然执行性能不足,但是开发效率有余;而当遇上Golang,这些优势似乎不那么明显了 。
一文让你知道为什么学了PHP的都要转学Go语言

文章插图
 
作为出现在互联网时代的服务端语言,面向用户服务的能力必不可少 。GO在语言级别自带HTTP/TCP/UDP高性能服务器,基于协程并发,为业务开发提供最直接有效的能力支持 。要在GO语言中实现一个高性能的HTTP Server,只需要几行代码即可完成,非常简单 。


推荐阅读