Go语言介绍
编程语言的三种划分方式
编译型 or 解释型
# 编译型:java,c,c++,c#,go 源代码编译生成机器语言,然后由机器直接执行机器码即可执行
编译型语言涉及到跨平台,因为它需要编译成该平台的可执行文件。如redis和mysql等c语言写的软件,在linux平台需要编译并安装,在windows平台下载编译好的exe文件直接运行安装。
java写的软件,运行在jvm之上,不同平台装java虚拟机就可以运行。
go语言,跨平台编译,交叉编译,比如,在windows平台开发并编译出在mac上可执行的文件。
# 解释型:python,js,php... 源代码先翻译为中间代码,然后由解释器对代码进行解释执行
不存在跨平台问题,需要安装解释器。
javascript的解释器是浏览器自带的,所有不用装js解释器,node.js利用v8引擎扣出来的解释器,因此能够写后端代码并通过解释器执行。
强类型 or 弱类型
# 强类型语言(python、go都属于强类型)
数据类型不可以被忽略的语言,即变量的数据类型一旦被定义,那就不会再改变,除非进行强转。不同数据类型不允许直接运算。
在python中,例如:name = 'egon',这个变量name在被赋值的那一刻,数据类型就被确定死了,是字符型,值为'egon'。
# 弱类型语言:javascript
数据类型可以被忽略的语言 比如linux中的shell中定义一个变量,是随着调用方式的不同,数据类型可随意切换的那种。
动态型 or 静态型
# 动态语言(python属于动态语言)
运行时才进行数据类型检查(利用反射),即在变量赋值时,就确定了变量的数据类型,不用事先给变量指定数据类型
# 静态语言(go属于静态语言)
需要事先给变量进行数据类型定义
所以综上所述,Python是一门解释型的强类型动态语言,go是一门编译型的强类型静态语言。
1 Go语言介绍
Go 即Golang,是Google公司2009年11月正式对外公开的一门编程语言。
Go是静态强类型语言,是区别于解析型语言的编译型语言。
2 Go语言特性
跨平台的编译型语言,交叉编译
语法接近C语言
管道(channel),切片(slice),并发(routine)
有垃圾回收的机制,c语言就没有垃圾回收机制,需要手动释放内存
支持面向对象和面向过程的编程模式(go的面向对象没有类的概念),但不是纯粹的面向对象语言
3 Go语言发展(版本/特性)
2009年11月7日 weekly.2009-11-06 —— 早期的版本
2012年3月28日 go1 —— 稳定版版的发布
2013年5月14日 go1.1 —— 语言本身的变化、库的变化等。
2013年12月01日 go1.2 —— 提供更好的调度和一个新的语言特性。
2014年6月18日 go1.3 —— 主要是在实现的工作上的变化,以及精准的垃圾回收。
2014年12月10日 go1.4 —— 包含了2个很小的语言变更。
2015年8月19日 go1.5 —— 实现的架构变化,同时保留了和旧版本的兼容性,本次更新中移除了”最后残余的C代码”。
# go是由c语言开发的,从此以后,自举(自己写自己),新的东西就是用go语言写的,便于读源码学习
2016年2月7日 go1.6 —— 语言本身、运行时、和库的实现的变化。
2016年8月15日 go1.7 —— 标准库有显着的性能改进和变化。
2017年2月26日 go1.8 —— 标准库有显着的性能改进和变化。
2017年8月24日 go1.9 —— 是包含语言,标准库,以及运行时的诸多变化。这个版本中的大部分工作都是对运行时和工具的改进。
2018年2月16日 go1.10 —— 大部分更改都在工具链,运行时和库的实现中。
2018年8月24日 go1.11 —— modules和WebAssembly支持。modules即包管理
2019 年 2 月 go 1.12 —— modules和WebAssembly支持。
2019 年 2 月 go 1.12— — 基于 analysi包重写了 go vet`命令,为开发者写自己的检查器提供了更大的灵活性
2019 年 9 月 go 1.13— — 改进了 sync
包中的 Pool
,在 gc 运行时不会清除 pool。它引进了一个缓存来清理两次 gc 运行时都没有被引用的 pool 中的实例。重写了逃逸分析,减少了 Go 程序中堆上的内存申请的空间
2020 年 2 月 go 1.14— — 现在 Go Module 已经可以用于生产环境,鼓励所有用户迁移到 Module。该版本支持嵌入具有重叠方法集的接口。性能方面做了较大的改进,包括:进一步提升 defer 性能、页分配器更高效,同时 timer 也更高效。现在,Goroutine 支持异步抢占
# 语法变化
– 增加一种非常小概率使用的for range语法
for range x { … } 等价于 for _ = range x {…}
– 不再自动对 **T 进行解引用(dereference)
对 var x **T,以前可直接用 x.Fn() 调用 T 的方法
– 现在需要明确写 (*x).Fn()
– 引入 internal package 概念在 Go1.4 只对主路径($GOROOT)有效,未来会全面应用到$GOPATH
– 引入 canonical import paths (权威导入路径) 概念
package pdf // import "rsc.io/pdf"
#2 实现细节
– 开始支持 Android (编译出binary或.so)
– 运行时(runtime)
-大部分用Go重写(以前是C),好处:更加精确的GC
-放弃了分段栈(segmented stack)
2020 年 8 月 go 1.15
# 1 语法变化
– map 字面量简化写法
var x = map[Point]int{{1.0, 2.1}: 1,{2.3, 4.5}: 2,}
# 2 实现细节
– 自举:不再有C,所有代码(包括编译器、链接器和运行时)都用Go和少量汇编实现
– GC:重写GC,进一步降低GC的latency
– GOMAXPROCS 默认是 CPU 数(以前是1)
– 开始支持 iOS:Go team 还提交了第一个 Go 写的 AppStore 应用 Ivy
4 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特别适合做网络并发的服务,这是他的强项,所以也是被优先用于这些项目。
5 Go语言应用领域
- 服务端开发
- 运维相关(docker,k8s)
- 分布式系统,微服务
- 网络编程
- 区块链开发
- 内存KV数据库,例如boltDB、levelDB
- 云平台
6 Go语言项目
docker:基于lxc的一个虚拟打包工具,能够实现PAAS平台的组建。
kubernetes:k8s是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。
区块链:BTCD 是用go语言实现的完整节点的比特币实现,区块链是另一种业务逻辑,用任何语言都可以写,只不过第一款开源区块链产品是用go写的,后面的产品都是在此基础上进行修改。
nsq:bitly开源的消息队列系统,性能非常高,目前他们每天处理数十亿条的消息。
packer:用来生成不同平台的镜像文件,例如VM、vbox、AWS等,作者是vagrant的作者。
skynet:分布式调度框架。
Doozer:分布式同步工具,类似ZooKeeper。
Heka:mazila开源的日志处理系统。
cbfs:couchbase开源的分布式文件系统。
7 Go语架构
GOPATH的工作区包含bin,src,和pkg这三个:
src——源码(包含第三方的和自己项目的)
bin——编译生成的可执行程序
pkg——编译时生成的对象文件
tsuru:开源的PAAS平台,和SAE实现的功能一模一样。
groupcache:memcahe作者写的用于Google下载系统的缓存系统。
god:类似redis的缓存系统,但是支持分布式和扩展性。
gor:网络流量抓包和重放工具。
Go语言发展前景,为什么火
语法简单,速度快
云计算和区块链的推动,互联网企业高并发的需求
缺点:很新,生态不完善