wshq 发表于 2018-9-21 08:43:22

GO语言发展历程以及优势,前景浅谈.

背景介绍:
  为什么要开发go语言呢?
  Go语言官方自称,之所以开发go语言,是因为”近10年来的开发程序之难让我们有点沮丧”.
  Go语言是谷歌推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发Go,是因为过去10多年间软件开发的难度令人沮丧。派克表示,和今天的C++或C一样,Go是一种系统语言。他解释道,“使用它可以进行快速开发,同时它还是一个真正的编译语言,我们之所以现在将其开源,原因是我们认为它已经非常有用和强大。”
  2007年,谷歌把Go作为一个20%项目开始研发,即让员工抽出本职工作之外时间的20%, 投入在该项目上。除了派克外,该项目的成员还有其他谷歌工程师也参与研发。
  派克表示,编译后Go代码的运行速度与C语言非常接近,而且编译速度非常快,就像在使用一个交互式语言。现有编程语言均未专门对多核处理器进行优化。Go就是谷歌工程师为这类程序编写的一种语言。它不是针对编程初学者设计的,但学习使用它也不是非常困难。Go支持面向对象,而且具有真正的闭包(closures)和反射 (reflection)等功能。
  在谷歌公开发布的所有网络应用中,均没有使用Go,但是谷歌已经使用该语言开发了几个内部项目。派克表示,Go是否会对谷歌即将推出的Chrome OS产生影响,还言之尚早,不过Go的确可以和Native Client配合使用。他表示“Go可以让应用完美的运行在浏览器内。”例如,使用Go可以更高效的实现Wave,无论是在前端还是后台。
  Go 同时具有两种编译器,一种是建立在GCC基础上的Gccgo,另外一种是分别针对64位x64和32位x86计算机的一套编译器(6g和8g)。谷歌目前正在研发其对ARM芯片和Android设备的支持。派克表示,“Android手机存在的问题是,我们一直没有一个数学协处理器。”
  闭包:就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁
  反射:
  讲反射时必须先了解JVM,
  例:Object o=new Object();运行起来:
  首先JVM会启动,你的代码会编译成一个.class文件,然后被类加载器加载进jvm的内存中,你的类Object加载到方法区中,创建了Object类的class对象到堆中,注意这个不是new出来的对象,而是类的类型对象,每个类只有一个class对象,作为方法区类的数据结构的接口。jvm创建对象前,会先检查类是否加载,寻找类对应的class对象,若加载好,则为你的对象分配内存,初始化也就是代码:new Object()。题主想想上面的程序对象是自己new的,程序相当于写死了给jvm去跑
  反射是什么呢?
  对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制.

  当我们的程序在运行时,需要动态的加载一些类这些类可能之前用不到所以不用加载到jvm,而是在运行时根据需要才加载,这样的好处对于服务器来说不言而喻,举个例子我们的项目底层有时是用mysql,有时用oracle,需要动态地根据实际情况加载驱动类,这个时候反射就有用了,假设 com.java.dbtest.myqlConnection,com.java.dbtest.oracleConnection这两个类我们要用,这时候我们的程序就写得比较动态化,通过Class tc =>简介:
  Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。
  Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区
  目标:
  Go的目标是希望提升现有编程语言对程序库等依赖性(dependency)的管理,这些软件元素会被应用程序反复调用。由于存在并行编程模式,因此这一语言也被设计用来解决多处理器的任务。
  谷歌大约2007年开始开发Go,并于2008年投入了一组全职员工。谷歌当初将该语言设计为一款系统编程语言,可以被用于网络服务器、存储系统和数据库中。但是谷歌认为,该语言还有望被用于其它领域。
硬件架构
  Go语言设计支持主流的32位和64位的x86平台,同时也支持32位的ARM架构。
操作系统
  Go语言在Go1版本上支持Windows, 苹果Mac OS X, Linux和FreeBSD操作系统。
go语言的历程:
  2007年,谷歌工程师Rob Pike, Ken Thompson和Robert Griesemer开始设计一门全新的语言,这是Go语言的最初原型。
  2009年11月10日,Go语言以开放源代码的方式向全球发布。
  2011年3月16日,Go语言的第一个稳定(stable)版本r56发布。
  2012年3月28日,Go语言的第一个正式版本Go1发布。
  2013年4月04日,Go语言的第一个Go 1.1beta1测试版发布。
  2013年4月08日,Go语言的第二个Go 1.1beta2测试版发布。
  2013年5月02日,Go语言Go 1.1RC1版发布。
  2013年5月07日,Go语言Go 1.1RC2版发布。
  2013年5月09日,Go语言Go 1.1RC3版发布。
  2013年5月13日,Go语言Go 1.1正式版发布。
  2013年9月20日,Go语言Go 1.2RC1版发布。
  2013年12月1日,Go语言Go 1.2正式版发布。
  2014年6月18日,Go语言Go 1.3版发布。
  2014年12月10日,Go语言Go 1.4版发布。
  2015年8月19日,Go语言Go 1.5版发布,本次更新中移除了”最后残余的C代码”。
  2016年2月17日,Go语言Go 1.6版发布。
  2016年8月15日,Go语言Go 1.7版发布。
  2017年2月17日,Go语言Go 1.8版发布。
  2017年8月24日,Go语言Go 1.9版发布。
  2018年2月16日,Go语言Go 1.10版发布。
go语言特性与优势:
  特点:
  简洁 快速 安全
  并行 有趣 开源,
  内存管理,数组安全,编译迅速

[*]保留但大幅度简化指针:Golang 保留着C中值和指针的区别,但是对于指针繁琐用法进行了大量的简化,引入引用的概念。所以在 Golang 中,你几乎不用担心会因为直接操作内寸而引起各式各样的错误。
  2.多参数返回:
  还记得在C里面为了回馈多个参数,不得不开辟几段指针传到目标函数中让其操作么?在 Go 里面这是完全不必要的。而且多参数的支持让 Go 无需使用繁琐的 exceptions 体系,一个函数可以返回期待的返回值加上 error,调用函数后立刻处理错误信息,清晰明了。
  3.Array, slice, map 等内置基本数据结构

  Golang 最让人赞叹不易的特性,就是 interface 的设计。任何数据结构,只要实现了 interface 所定义的函数,自动就 implement 了这个 interface,没有像 Java 那样冗长的>
  4.OO 面向对象: Golang 本质上不是面向对象语言,它还是过程化的。但是,在 Golang 中, 你可以很轻易的做大部分你在别的 OO 语言中能做的事,用更简单清晰的逻辑。是的,在这里,不需要>  5.Goroutine : 如果你完全不了解 Goroutine,那么你只需要知道,这玩意是超级轻量级的类似线程的东西,但通过它,你不需要复杂的线程操作锁操作,不需要 care 调度,就能玩转基本的并行程序。在 Golang 里,触发一个 routine 和 erlang spawn 一样简单。基本上要掌握 Golang,以 Goroutine 和 channel 为核心的内存模型是必须要懂的
  优势:

[*]部署简单: go编译生成一个静态可执行文件,除了glibc外没有其他外部依赖,这让部署变得异常方便,目标机器上只需要一个基础的系统和必要的管理,监控工具,完全不用操心应用所需的各种包 库的依赖关系,大大减轻维护的负担.
[*]并发性好:Goroutine和channel是编写高并发的服务端软件变得相当容易,很多情况下不需要考虑锁机制以及相关的各种问题.单个go应用也能有效的利用多个cpu,并发执行的性能好.
[*]良好的语言设计: 从学术角度讲go语言其实非常平庸,不过支持很多高级的语言特征,但从工程角度,go语言的设计十分优秀,规范足够简单灵活,更重要的是go语言自带完善的工具链,大大提高团队的协作一致性.
[*]执行性能好: 虽然不如c与java,但通常比原生的python应用还是高一个数量级的,适合编写一些瓶颈业务,内存占用十分节省.
[*]支持垃圾回收,这属于动态语言的特性之一吧,虽然目前来说GC不算完美,但是足以应付我们所能遇到的大多数情况,特别是Go1.1之后的GC。
[*]跨平台编译,如果你写的Go代码不包含cgo,那么就可以做到window系统编译linux的应用,如何做到的呢?Go引用了plan9的代码,这就是不依赖系统的信息.
用途:
  Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。
  对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。
  服务器编程,以前你如果使用C或者C++做的那些事情,用Go来做很合适,例如处理日志、数据打包、虚拟机处理、文件系统等。
  分布式系统,数据库代理器等网络编程,这一块目前应用最广,包括Web应用、API应用、下载应用、
  内存数据库,前一段时间google开发的groupcache,couchbase的部分组建
  云平台,目前国外很多云平台在采用Go开发,CloudFoundy的部分组建,前VMare的技术总监自己出来搞的apcera云平台。
  Go成功的项目:
  nsq:bitly开源的消息队列系统,性能非常高,目前他们每天处理数十亿条的消息
  docker:基于lxc的一个虚拟打包工具,能够实现PAAS平台的组建。
  packer:用来生成不同平台的镜像文件,例如VM、vbox、AWS等,作者是vagrant的作者
  skynet:分布式调度框架
  Doozer:分布式同步工具,类似ZooKeeper
  Heka:mazila开源的日志处理系统
  cbfs:couchbase开源的分布式文件系统
  tsuru:开源的PAAS平台,和SAE实现的功能一模一样
  groupcache:memcahe作者写的用于Google下载系统的缓存系统
  god:类似redis的缓存系统,但是支持分布式和扩展性
  gor:网络流量抓包和重放工具
各大公司的go语言应用:
Google
  这个不用多做介绍,作为开发Go语言的公司,当仁不让。Google基于Go有很多优秀的项目,比如:https://github.com/kubernetes/kubernetes ,大家也可以在Github上 https://github.com/google/ 查看更多Google的Go开源项目。
Facebook
  Facebook也在用,为此他们还专门在Github上建立了一个开源组织facebookgo,大家可以通过https://github.com/facebookgo访问查看facebook开源的项目,比如著名的是平滑升级的grace。
腾讯
  腾讯作为国内的大公司,还是敢于尝试的,尤其是Docker容器化这一块,他们在15年已经做了docker万台规模的实践,具体可以参考http://www.infoq.com/cn/articles/tencent-millions-scale-docker-application-practice 。
  主要职责是:
  负责腾讯游戏蓝鲸平台后台开发工作
  负责容器相关的开发工作
  和蓝鲸平台,容器开发有关。腾讯作为主要使用C/C++的公司,使用Go会方便很多,也有很多优势,不过日积月累的C/C++代码很难改造,也不敢动,所以新业务会在Go方面尝试。
百度
  目前所知的百度的使用是在运维这边,是百度运维的一个BFE项目,负责前端流量的接入。他们的负责人在2016年有分享,大家可以看下这个 http://www.infoq.com/cn/presentations/application-of-golang-in-baidu-frontend .
  其次就是百度的消息系统,从其最近的Golang招聘介绍就可以看出来.
  负责公司手百消息通讯系统服务器端开发及维护
京东
  京东云消息推送系统、云存储,以及京东商城等都有使用Go做开发。
小米
  小米对Golang的支持,莫过于运维监控系统的开源,也就是 http://open-falcon.com/ 。
  此外,小米互娱、小米商城、小米视频、小米生态链等团队都在使用Golang。
360
  360对Golang的使用也不少,一个是开源的日志搜索系统Poseidon,托管在Github上,https://github.com/Qihoo360/poseidon.
  还有360的推送团队也在使用,他们还写了篇博文在Golang的官方博客上 https://blog.golang.org/qihoo。
  360直播在招聘Golang开发工程师。
  美团、滴滴、新浪以及七牛等。一般的选择,都是选择用于自己公司合适的产品系统来做,比如消息推送的、监控的、容器的等,Golang特别适合做网络并发的服务,这是他的强项,所以也是被优先用于这些项目。

页: [1]
查看完整版本: GO语言发展历程以及优势,前景浅谈.