Go语言入门前先看下这些知识

GO语言简介

Go语言主要用作服务器端开发,其定位是用来开发“大型软件”的,适合于很多程序员一起开发大型软件,并且开发周期长,支持云计算的网络服务。Go语言能够让程序员快速开发,并且在软件不断的增长过程中,它能让程序员更容易地进行维护和修改。它融合了传统编译型语言的高效性和脚本语言的易用性和富于表达性。

Go语言作为服务器编程语言,很适合处理日志、数据打包、虚拟机处理、文件系统、分布式系统、数据库代理等;网络编程方面,Go语言广泛应用于Web应用、API应用、下载应用等;除此之外,Go语言还可用于内存数据库和云平台领域,目前国外很多云平台都是采用Go开发。

Go语言的优势

强大的开发阵营

GO语言的开发阵营可以说是空前强大,主要成员中不乏计算机软件界的历史性人物,对计算机软件的发展影响深远。我调两个具有代表性的介绍一下:KenThompson,来自贝尔实验室,设计了B语言,创立了Unix操作系统(最初使用B语言实现),随后在Unix开发过程中,又和DennisRitchie一同设计了C语言,继而使用C语言重构了Unix操作系统。

可以说,GO语言背靠Google这棵大树,又不乏牛人坐镇,是名副其实的“牛二代”。

丰富的业务案例

近期大名鼎鼎的Docker,完全用GO实现,业界最为火爆的容器编排管理系统kubernetes,完全用GO实现,之后的DockerSwarm,完全用GO实现。除此之外,还有各种有名的项目如etcd/consul/flannel等等,均使用GO实现。

除了云项目外,还有像今日头条、UBER这样的公司,他们也使用GO语言对自己的业务进行了彻底的重构。

Go语言的丰富的业务案例也是让他火起来的重要原因之一。

Go语言的关键特性抓住了程序员的痛点

GO语言之所以厉害,是因为它在服务端的开发中,总能抓住程序员的痛点,以最直接、简单、高效、稳定的方式来解决问题。

接下来我们就介绍一下几个关键特特性:

并发与协程在当今这个多核时代,并发编程的意义不言而喻。当然,很多语言都支持多线程、多进程编程,但是实现和控制都没go语言轻松。Golang不同的是,语言级别支持协程(goroutine)并发(协程又称微线程,比线程更轻量、开销更小,性能更高),操作起来非常简单,语言级别提供关键字(go)用于启动协程,并且在同一台机器上可以启动成千上万个协程。简单的说就是Go语言对于多线程和协程的实现比其他任何语言都简单并且易于控制。基于消息传递的通信方式在GO语言中,使用基于消息传递的通信方式(而不是大多数语言所使用的基于共享内存的通信方式)进行协程间通信,并且将消息管道(channel)作为基本的数据类型,使用类型关键字(chan)进行定义,并发操作时线程安全。GO语言本身并非简单得没有底线,恰恰他们会将最实用、最有利于解决问题的能力,以最简单、直接的形式提供给用户。Channel并不仅仅只是用于简单的消息通信,还可以引申出很多非常实用,而实现起来又非常方便的功能。比如,实现TCP连接池、限流等等,而这些在其它语言中实现起来并不轻松,但GO语言可以轻易做到。丰富实用的内置数据类型这个就不多说了,我啊放一张图,你们自己看一下就好。

defer延迟处理机制机制关键字defer,可以通过该关键字指定需要延迟执行的逻辑体,即在函数体return前或出现panic时执行。这种机制非常适合善后逻辑处理,比如可以尽早避免可能出现的资源泄漏问题。可以说,defer是继goroutine和channel之后的另一个非常重要、实用的语言特性,对defer的引入,在很大程度上可以简化编程,并且在语言描述上显得更为自然,极大的增强了代码的可读性。反射(reflect)Golang作为强类型的编译型语言,灵活性上自然不如解析型语言。比如像PHP,弱类型,并且可以直接对一个字符串变量的内容进行new操作,而在编译型语言中,这显然不太可能。但是,Golang提供了Any类型(interface{})和强大的类型反射(reflect)能力,二者相结合,开发的灵活性上已经很接近解析型语言。高性能HTTPServer作为出现在互联网时代的服务端语言,面向用户服务的能力必不可少。GO在语言级别自带HTTP/TCP/UDP高性能服务器,基于协程并发,为业务开发提供最直接有效的能力支持。要在GO语言中实现一个高性能的HTTPServer,只需要几行代码即可完成,非常简单。工程管理在GO语言中,有一套标准的工程管理规范,只要按照这个规范进行项目开发,之后的事情(比如包管理、编译等等)都将变得非常的简单。在GO的编译过程中,我们唯一要做的就是将GO项目路径赋值给一个叫GOPATH的环境变量,让编译器知道将要编译的GO项目所在的位置。然后进入bin目录下,执行gobuild{主包所在的目录名},即可秒级完成工程编译。编译后的二进制文件,可以推到同类OS上直接运行,没有任何环境依赖。这些优势有没有吸引到你?看完了优势我们来看一看Go语言的缺点是什么没有泛型Go语言没有泛型。对于来自使用Java这样的语言的开发者来说,要转向Go语言,这是一个需要克服的巨大障碍。这意味着代码的重用级别降低了。虽然Go语言有头等函数,但如果编写“map”、“reduce”和“filter”等函数,将这些函数设计为对一种类型的集合进行操作,就不能将这些函数重用于其他不同的类型集合。要解决这一问题有很多方法,但都最终都要涉及到编写更多的代码,如此一来,生产力和可维护性就降低了。库支持不佳Go语言的库支持参差不齐。我们的API与Contentful集成,但后者并没有官方支持的GoSDK。这意味着我们必须编写(并维护!)大量代码来请求和解析Contentful中的数据。我们还必须依赖第三方的Elasticsearch库。分裂的依赖关系管理很长一段时间以来,Go语言没有一个稳定的、正式的包管理器。经过多年的社区乞求,Go项目最近才发布godep。




转载请注明:http://www.aierlanlan.com/rzgz/3136.html