背景介绍:
为什么要开发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 = Class.forName("com.java.dbtest.TestConnection");通过类的全类名让jvm在服务器中找到并加载这个类,而如果是oracle则传入的参数就变成另一个了。这时候就可以看到反射的好处了,这个动态性就体现出java的特性了!举多个例子,大家如果接触过spring,会发现当你配置各种各样的bean时,是以配置文件的形式配置的,你需要用到哪些bean就配哪些,spring容器就会根据你的需求去动态加载,你的程序就能健壮地运行。
简介:
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语言的最初原型。[1]
2009年11月10日,Go语言以开放源代码的方式向全球发布。[1]
2011年3月16日,Go语言的第一个稳定(stable)版本r56发布。[2]
2012年3月28日,Go语言的第一个正式版本Go1发布。[2]
2013年4月04日,Go语言的第一个Go 1.1beta1测试版发布。[3]
2013年4月08日,Go语言的第二个Go 1.1beta2测试版发布。[3]
2013年5月02日,Go语言Go 1.1RC1版发布。[4]
2013年5月07日,Go语言Go 1.1RC2版发布。[5]
2013年5月09日,Go语言Go 1.1RC3版发布。 [6]
2013年5月13日,Go语言Go 1.1正式版发布。
2013年9月20日,Go语言Go 1.2RC1版发布。[7]
2013年12月1日,Go语言Go 1.2正式版发布。[8]
2014年6月18日,Go语言Go 1.3版发布。[9]
2014年12月10日,Go语言Go 1.4版发布。[10]
2015年8月19日,Go语言Go 1.5版发布,本次更新中移除了”最后残余的C代码”。[11]
2016年2月17日,Go语言Go 1.6版发布。[12]
2016年8月15日,Go语言Go 1.7版发布。[13]
2017年2月17日,Go语言Go 1.8版发布。[14]
2017年8月24日,Go语言Go 1.9版发布。[15]
2018年2月16日,Go语言Go 1.10版发布。[16]
go语言特性与优势:
特点:
简洁 快速 安全
并行 有趣 开源,
- 保留但大幅度简化指针: Golang 保留着C中值和指针的区别,但是对于指针繁琐用法进行了大量的简化,引入引用的概念。所以在 Golang 中,你几乎不用担心会因为直接操作内寸而引起各式各样的错误。
2.多参数返回:
还记得在C里面为了回馈多个参数,不得不开辟几段指针传到目标函数中让其操作么?在 Go 里面这是完全不必要的。而且多参数的支持让 Go 无需使用繁琐的 exceptions 体系,一个函数可以返回期待的返回值加上 error,调用函数后立刻处理错误信息,清晰明了。
3.Array, slice, map 等内置基本数据结构
Golang 最让人赞叹不易的特性,就是 interface 的设计。任何数据结构,只要实现了 interface 所定义的函数,自动就 implement 了这个 interface,没有像 Java 那样冗长的 class 申明,提供了灵活太多的设计度和 OO (面向对象)抽象度,让你的代码也非常干净。
4.OO 面向对象: Golang 本质上不是面向对象语言,它还是过程化的。但是,在 Golang 中, 你可以很轻易的做大部分你在别的 OO 语言中能做的事,用更简单清晰的逻辑。是的,在这里,不需要 class,仍然可以继承,仍然可以多态,但是速度却快得多。因为本质上,OO 在 Golang 中,就是普通的 struct 操作。
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语言应用:
这个不用多做介绍,作为开发Go语言的公司,当仁不让。Google基于Go有很多优秀的项目,比如:https://github.com/kubernetes/kubernetes ,大家也可以在Github上 https://github.com/google/ 查看更多Google的Go开源项目。
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特别适合做网络并发的服务,这是他的强项,所以也是被优先用于这些项目。