第一讲 go 语言简介
2016-07-28 15:25
302 查看
没有停止学习脚步的程序员,这篇博客这要介绍为什么要学习go语言,go语言是一种新的语言,一种并发的,带垃圾回收的、快速编译的语言
不仅就有上述特点,更重要的是,在我面试几家公司之后,面试官反复提到如果会go语言的话会更好。(这样学习的动力马上就有)
Go为软件构造提供了一种模型,它使依赖分析更加容易,且避免了大部分C风格include文件与库的开头。
它可以在一台计算机上用几秒钟的时间编译一个大型的Go程序。
静态类型语言,但是有动态语言的感觉,静态类型的语言就是可以在编译的时候检查出隐藏的问题,动态语言就是有很多包可以使用,写起来的效率很高。
Go是静态类型的语言,它的类型系统没有层级。因此用户不需要在定义类型之间的关系上花费时间,这样感觉起来比典型的面向对象语言更轻量级。
语言层面支持并发,这个是go语言的最大特色,go就是基因里面支持的并发,可以利用多并发,很容易使用并发Goroutine 和 channel 使得编写高并发的服务端软件变得相当容易,很多情况下完全不需要考虑锁机制以及由此带来的各种问题。单个Go应用也能有效的利用多个 CPU 核,并行执行的性能好。这和Python也是天壤之比。多线程和多进程的服务端程序编写起来并不简单,而且由于全局锁GIL的原因,多线程的Python程序并不能有效利用多核,只能用多进程的方式部署;如果用标准库里的multiprocessing包又会对监控和管理造成不少的挑战(我们用的supervisor管理进程,对fork支持不好)。部署Python应用的时候通常是每个CPU核部署一个应用,这会造成不少资源的浪费,比如假设某个Python应用启动后需要占用 100MB 内存,而服务器有 32 个CPU核,那么留一个核给系统、运行 31 个应用副本就要浪费 3GB 的内存资源。
内置runtime,支持垃圾回收,并为并发执行与通信提供了基本的支持。
简单易学,Go语言的作者都有C的基因,那么Go自然而然就有了C的基因,那么Go关键字是25个,但是表达能力很强大,几乎支持大多数你在其他语言见过的特性:继承、重载、对象等。
丰富的标准库,Go目前已经内置了大量的库,特别是网络库非常强大
内嵌C支持,每一种语言像他会内嵌这么好。
分布式系统、数据库代理器
网络编程(这一块被应用的最广泛) web应用、API应用、下载应用
内存数据库,谷歌开发的groupcache,couchbase的部分组件
云平台,目前国外很多云平台使用Go开,CloudFoundy的部分组件,apcera云平台
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的goroutine一旦启动之后,不同的goroutine之间切换不是受程序控制,runtime调度的时候,需要严谨的逻辑,不然goroutine休眠,过一段时间逻辑结束了,突然冒出来又执行了,会导致逻辑出错等情况。
GC延迟有点大处理很大的日志,GC没有那么快,内存回收不给力
pkg下面的图片处理库很多bug,还是使用成熟产品好,调用这些成熟库imagemagick的接口比较靠谱
不仅就有上述特点,更重要的是,在我面试几家公司之后,面试官反复提到如果会go语言的话会更好。(这样学习的动力马上就有)
Go有什么优势
可直接编译成机器码,不依赖其他库,glibc的版本有一定的要求,部署就是扔一个文件上去就完成。Go为软件构造提供了一种模型,它使依赖分析更加容易,且避免了大部分C风格include文件与库的开头。
它可以在一台计算机上用几秒钟的时间编译一个大型的Go程序。
静态类型语言,但是有动态语言的感觉,静态类型的语言就是可以在编译的时候检查出隐藏的问题,动态语言就是有很多包可以使用,写起来的效率很高。
Go是静态类型的语言,它的类型系统没有层级。因此用户不需要在定义类型之间的关系上花费时间,这样感觉起来比典型的面向对象语言更轻量级。
语言层面支持并发,这个是go语言的最大特色,go就是基因里面支持的并发,可以利用多并发,很容易使用并发Goroutine 和 channel 使得编写高并发的服务端软件变得相当容易,很多情况下完全不需要考虑锁机制以及由此带来的各种问题。单个Go应用也能有效的利用多个 CPU 核,并行执行的性能好。这和Python也是天壤之比。多线程和多进程的服务端程序编写起来并不简单,而且由于全局锁GIL的原因,多线程的Python程序并不能有效利用多核,只能用多进程的方式部署;如果用标准库里的multiprocessing包又会对监控和管理造成不少的挑战(我们用的supervisor管理进程,对fork支持不好)。部署Python应用的时候通常是每个CPU核部署一个应用,这会造成不少资源的浪费,比如假设某个Python应用启动后需要占用 100MB 内存,而服务器有 32 个CPU核,那么留一个核给系统、运行 31 个应用副本就要浪费 3GB 的内存资源。
内置runtime,支持垃圾回收,并为并发执行与通信提供了基本的支持。
简单易学,Go语言的作者都有C的基因,那么Go自然而然就有了C的基因,那么Go关键字是25个,但是表达能力很强大,几乎支持大多数你在其他语言见过的特性:继承、重载、对象等。
丰富的标准库,Go目前已经内置了大量的库,特别是网络库非常强大
内嵌C支持,每一种语言像他会内嵌这么好。
小结
Go是一种编译型语言,它结合了解释型语言的游刃有余,动态类型语言的开发效率,以及静态类型的安全性。它也打算成为现代的,支持网络与多核计算的语言。要满足这些目标,需要解决一些语言上的问题:一个富有表达能力但轻量级的类型系统,并发与垃圾回收机制,严格的依赖规范等等。这些无法通过库或工具解决好,因此Go也就应运而生了Go适合做什么
服务器编程,如果使用C或者C++实现的功能,利用Go来做很适合,例如处理日志,数据打包、虚拟机处理、文件系统等分布式系统、数据库代理器
网络编程(这一块被应用的最广泛) web应用、API应用、下载应用
内存数据库,谷歌开发的groupcache,couchbase的部分组件
云平台,目前国外很多云平台使用Go开,CloudFoundy的部分组件,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的import包不包括版本,有时候升级导致项目不可行,所以需要自己控制相应的版本信息Go的goroutine一旦启动之后,不同的goroutine之间切换不是受程序控制,runtime调度的时候,需要严谨的逻辑,不然goroutine休眠,过一段时间逻辑结束了,突然冒出来又执行了,会导致逻辑出错等情况。
GC延迟有点大处理很大的日志,GC没有那么快,内存回收不给力
pkg下面的图片处理库很多bug,还是使用成熟产品好,调用这些成熟库imagemagick的接口比较靠谱
相关文章推荐
- 开发人员、程序员与计算机科学家三者之间的区别
- 你应该学习哪种编程语言?
- [转]我们需要一种其他人能使用的编程语言
- 程序员必备,程序员四大忌
- 程序员们,做好你手里的俩份试卷
- 程序员必备的10大健康装备! 我们要工作更要健康!
- 一篇关于程序员性格的文章第1/3页
- 8种类型极品程序员,不知你属于哪一种?
- C#语言主要特性总结
- 程序员编程从初级到中级的10个秘诀
- C语言中static的作用及C语言中使用静态函数有何好处
- 做一个优秀程序员应该知道的15件事
- 程序员开发项目是选择效率还是质量呢?
- 程序员的八种境界,你在哪一境?
- 五个PHP程序员工具
- PHP 程序员应该使用的10个组件
- PHP检测用户语言的方法
- 程序员学英语的一个方法
- 腾讯QQ php程序员面试题目整理
- 程序员必看2008编程语言走势解盘