事先声明:本文部分内容参考了尹成的笔记,如果侵权请联系删除。
我是一名自学go语言的初学者,从今天开始我将会坚持更新go语言的相关知识,从入门到精通,如果大家有什么需要可以加我QQ:2394799692,一起学习和讨论关于golang的知识。
一,为什么要学习go语言?
如果你要创建系统程序,或者基于网络的程序,Go语言是很不错的选择。作为一种相对较新的语言,它是由经验丰富且受人尊敬的计算机科学家设计的,旨在应对创建大型并发网络程序面临的挑战。
在Go语言出现之前,开发者们总是面临非常艰难的抉择,究竟是使用执行速度快但是编译速度并不理想的语言(如:C++),还是使用编译速度较快但执行效率不佳的语言(如:.NET、Java),或者说开发难度较低但执行速度一般的动态语言呢?显然,Go语言在这3 个条件之间做到了最佳的平衡:快速编译,高效执行,易于开发。
Go语言支持交叉编译,比如说你可以在运行Linux 系统的计算机上开发可以在 Windows 上运行的应用程序。这是第一门完全支持 UTF-8 的编程语言,这不仅体现在它可以处理使用 UTF-8编码的字符串,就连它的源码文件格式都是使用的 UTF-8 编码。Go语言做到了真正的国际化!
一,go语言相对其他语言的优势
Go语言是集多编程范式之大成者,体现了优秀的软件工程思想和原则,其特性可以使开发者快速地开发、测试和部署程序,大大提高了生产效率。下面我们来看看与其他主流语言相比,Go语言具有的优势。
1)相对于 C/C++ 来讲,Go语言拥有清晰的依赖管理和全自动的垃圾回收机制,因此其代码量大大降低,开发效率大大提高。
2)相对于 Java 来讲,Go语言拥有简明的类型系统、函数式编程范式和先进的并发编程模型。因此其代码块更小更简洁、可重用性更高,并可在多核计算环境下更快地运行。
3)对于 PHP 来讲,Go语言更具通用性和规范性。这使得其更适合构建大型的软件,并能够更好地将各个模块组织在一起。在性能方面,PHP 不可与 Go 同日而语。
4)对于 Python/Ruby 来讲,Go 的优势在于其简洁的语法、非侵入式和扁平化的类型系统和浑然天成的多范式编程模型。与 PHP 一样,Python 和Ruby 也是动态类型的解释型语言,这就意味着它们的运行速度会比静态类型的编译型语言慢很多。
二,go语言相对其他语言的劣势
下面,我们来客观地看一下目前Go语言需要加强或改进的地方(虽然有些Gopher 并不这么认为)。
1)从分布式计算的角度来看,Go语言的成熟度不及 Erlang(现在已经出现了一些这方面的Go语言代码包,我们已经可以看到光明的未来了)。
2)从程序运行速度的角度来看,Go语言虽然已与 Java 不相上下,但还不及 C(差距正在不断地缩小)。
3)从第三方库的角度来看,Go语言的库数量还远远不及其他几门主流语言(比如 Java、Python、Ruby等)。不过与Go语言的年纪相比,用它实现的第三方库已经相当多了,并且它们的数量在持续地飞速增长中。
另外,在更深的层面,Go语言标准库中也有些不尽如人意的的地方,具体如下。
1)从语言语法角度来看,Go语言语法里的语法糖并不多,这让许多 Python、Ruby爱好者们对它不屑一顾。另外,变量赋值方式多得有点儿累赘了。最让人遗憾的也是我比较在意的一个地方是,Go语言不支持自定义的泛型类型。
2)从并发编程角度来看,Go语言提供的并发模型很强大,但也有一些编写规则需要了解。否则,很容易踩进“坑”里。其实不提倡把这叫作“坑”。因为这些所谓的“坑”,大都是我们由于对原理不熟悉而自己挖出来的。
3)从垃圾回收角度看,Go语言的垃圾回收采用的是并发的标记清除算法(Concurrent Mark andSweep,CMS)。虽然是并发的操作,时间比串行操作短很多,但是还是会在垃圾回收期间停止所有用户程序的操作。这一点多少会影响到对实时性要求比较高的应用。不过,在Go语言1.3 之后的版本中,这方面的问题已经得到了极大的改善。
虽然Go语言还有一些瑕疵,但从整体来看,它已经是一门非常优秀的通用编程语言了。并且,Go语言在今后的发展上会关注性能、可靠性、可移植性和一些功能增强,所以上述缺憾会随着版本的推进而逐渐减弱和消失。
三,我的总结
go语言兼具 Python 等动态语言的开发速度和 C/C++ 等编译型语言的性能与安全性。
我为什么选择go作为学习的开发语言:
1.我感觉很多大学都在教本科生java,如果我也学java的话,市场竞争压力相对较大,要有名校学历和超越常人的编码能力才有机会进入大厂,相对来说,学go语言的人没有那么多,现在很多互联网大厂又在向go语言转型,所以目前学go语言可以缩小竞争压力,可以更容易找到一份自己满意的工作。
2.go语言没有c++那么难学,go语言的总体薪资还不错
3.go语言有一个超级可爱的吉祥物,据说是go语言设计者之一Rob Pike 的妻子设计出来的。
4.Go之所以叫Go,是想表达这门语言的运行速度、开发速度、学习速度(develop)都像gopher一样快。
gopher是一种生活在加拿大的小动物,go的吉祥物就是这个小动物,它的中文名叫做囊地鼠,他们最大的特点就是挖洞速度特别快
二,go语言与c语言的关系
Go语言是编程语言设计的又一次尝试,是对类C语言的重大改进,它不但能让你访问底层操作系统,还提供了强大的网络编程和并发编程支持。Go语言的用途众多,可以进行网络编程、系统编程、并发编程、分布式编程。
Go语言的推出,旨在不损失应用程序性能的情况下降低代码的复杂性,具有“部署简单、并发性好、语言设计良好、执行性能好”等优势,目前国内诸多IT 公司均已采用Go语言开发项目。
Go语言有时候被描述为“C类似语言”,或者是“21 世纪的C语言”。Go从C语言继承了相似的表达式语法、控制流结构、基础数据类型、调用参数传值、指针等很多思想,还有C语言一直所看中的编译后机器码的运行效率以及和现有操作系统的无缝适配。
三,go语言创始人
Go语言出自Ken Thompson 和 Rob Pike、Robert Griesemer 之手,他们都是计算机科学领域的重量级人物。
1.Ken Thompson 是贝尔实验室 Unix团队成员,C语言、Unix 和 Plan 9 的创始人之一,在 20 世纪 70 年代,设计并实现了最初的 UNIX操作系统,仅从这一点说,他对计算机科学的贡献怎么强调都不过分。他还与 Rob Pike 合作设计了 UTF-8 编码方案。
2.Rob Pike是Go语言项目总负责人,贝尔实验室Unix 团队成员,除帮助设计 UTF-8 外,还帮助开发了分布式多用户操作系统 Plan 9、Inferno 操作系统和 Limbo编程语言,并与人合著了《The Unix Programming Environment》,对 UNIX 的设计理念做了正统的阐述。
3.Robert Griesemer 就职于 Google,参与开发 Java HotSpot 虚拟机,对语言设计有深入的认识,并负责 Chrome 浏览器和 Node.js 使用的 Google V8 JavaScript 引擎的代码生成部分。
这些计算机科学领城的重量级人物设计Go语言的初衷是满足Google 的需求。设计此语言花费了两年的时间,融入了整个团队多年的经验及对编程语言设计的深入认识。设计团队借鉴了 Pascal、Oberon和C语言的设计智慧,同时让Go语言具备动态语言的便利性。因此,Go语言体现了经验丰富的计算机科学家的语言设计理念,是为全球最大的互联网公司之一设计的。
设计师说为什么开发go语言:“我们做了大量的 C++ 开发,厌烦了等待编译完成,尽管这是玩笑,但在很大程度上来说也是事实。”
四,go语言的特性有哪些
一,go综合特性
语法简单,并发模型,内存分配,垃圾回收,静态链接,标准库,工具链,源码无需头文件,编译速度快。
除此之外,最重要的一点是高性能且简单快速
二,go语言的高性能
通过对C(gcc)、C++、Java、JavaScript 和Go语言的测试。性能比较如下表所示,表中数据的单位为秒,数值越小表明运行性能越好。
通过上表可以看出,Go语言在性能上更接近于Java 语言,虽然在某些测试用例上不如经过多年优化的 Java 语言,但毕竟 Java语言已经经历了多年的积累和优化。Go语言在未来的版本中会通过不断的版本优化提高单核运行性能。
三,go语言强大的标准库
Go语言的标准库(通常被称为语言自带的电池),提供了清晰的构建模块和公共接口,包含I/O 操作、文本处理、图像、密码学、网络和分布式应用程序等,并支持许多标准化的文件格式和编解码协议。
在 Windows下,标准库的位置在Go语言根目录下的子目录 pkg\windows_amd64 中;在 Linux 下,标准库在Go语言根目录下的子目录pkg\linux_amd64 中(如果是安装的是 32 位,则在 linux_386 目录中)。一般情况下,标准包会存放在$GOROOT/pkg/$GOOS_$GOARCH/ 目录下。
Go语言的编译器也是标准库的一部分,通过词法器扫描源码,使用语法树获得源码逻辑分支等。Go语言的周边工具也是建立在这些标准库上。在标准库上可以完成几乎大部分的需求。
Go语言的标准库以包的方式提供支持,下表列出了Go语言标准库中常见的包及其功能。
Go语言标准库包名 | 功 能 |
bufio | 带缓冲的 I/O 操作 |
bytes | 实现字节操作 |
container | 封装堆、列表和环形列表等容器 |
crypto | 加密算法 |
database | 数据库驱动和接口 |
debug | 各种调试文件格式访问及调试功能 |
encoding | 常见算法如 JSON、XML、Base64 等 |
flag | 命令行解析 |
fmt | 格式化操作 |
go | Go语言的词法、语法树、类型等。可通过这个包进行代码信息提取和修改 |
html | HTML 转义及模板系统 |
image | 常见图形格式的访问及生成 |
io | 实现 I/O 原始访问接口及访问封装 |
math | 数学库 |
net | 网络库,支持 Socket、HTTP、邮件、RPC、SMTP 等 |
os | 操作系统平台不依赖平台操作封装 |
path | 兼容各操作系统的路径操作实用函数 |
plugin | Go 1.7 加入的插件系统。支持将代码编译为插件,按需加载 |
reflect | 语言反射支持。可以动态获得代码中的类型信息,获取和修改变量的值 |
regexp | 正则表达式封装 |
runtime | 运行时接口 |
sort | 排序接口 |
strings | 字符串转换、解析及实用函数 |
time | 时间接口 |
text | 文本模板及 Token 词法器 |
四,go语法特性:
规范的语法(不需要符号表来解析)
垃圾回收(独有)
无头文件
明确的依赖
无循环依赖
常量只能是数字
int和int32是两种类型
字母大小写设置可见性(letter case sets visibility)
任何类型(type)都有方法(不是类型)
没有子类型继承(不是子类)
包级别初始化以及明确的初始化顺序
文件被编译到一个包里
包package-level globals presented in any order
没有数值类型转换(常量起辅助作用)
接口隐式实现(没有“implement”声明)
嵌入(不会提升到超类)
方法按照函数声明(没有特别的位置要求)
方法即函数
接口只有方法(没有数据)
方法通过名字匹配(而非类型)
没有构造函数和析构函数
postincrement(如++i)是状态,不是表达式
没有preincrement(i++)和predecrement
赋值不是表达式
明确赋值和函数调用中的计算顺序(没有“sequence point”)
没有指针运算
内存一直以零值初始化
局部变量取值合法
方法中没有“this”
分段的堆栈
没有静态和其它类型的注释
没有模板
内建string、slice和map
数组边界检查
五,go语言适合做什么
一,综合分析
Go 语言从发布 1.0 版本以来备受众多开发者关注并得到广泛使用,Go语言的简单、高效、并发特性吸引了众多传统语言开发者的加入,而且人数越来越多。
鉴于Go语言的特点和设计的初衷,Go语言作为服务器编程语言,很适合处理日志、数据打包、虚拟机处理、文件系统、分布式系统、数据库代理等;网络编程方面,Go语言广泛应用于Web应用、API应用、下载应用等;除此之外,Go语言还适用于内存数据库和云平台领域,目前国外很多云平台都是采用Go开发。
- 服务器编程,以前你如果使用C或者C++做的那些事情,用Go来做很合适,例如处理日志、数据打包、虚拟机处理、文件系统等。
- 分布式系统、数据库代理器、中间件等,例如Etcd。
- 网络编程,这一块目前应用最广,包括Web应用、API应用、下载应用,而且Go内置的net/http包基本上把我们平常用到的网络功能都实现了。
- 数据库操作
- 开发云平台,目前国外很多云平台在采用Go开发
二,国内外有哪些企业或项目使用go语言
Go发布之后,很多公司特别是云计算公司开始用Go重构他们的基础架构,很多都是直接采用Go进行了开发,最近热火朝天的Docker就是采用Go开发的。
使用 Go 语言开发的开源项目非常多。早期的 Go 语言开源项目只是通过 Go语言与传统项目进行C语言库绑定实现,例如 Qt、Sqlite 等;后期的很多项目都使用 Go语言进行重新原生实现,这个过程相对于其他语言要简单一些,这也促成了大量使用 Go 语言原生开发项目的出现。
- 云计算基础设施领域 代表项目:docker、kubernetes、etcd、consul、cloudflareCDN、七牛云存储等。
- 基础软件 代表项目:tidb、influxdb、cockroachdb等。
- 微服务 代表项目:go-kit、micro、monzo bank的typhon、bilibili等。
- 互联网基础设施 代表项目:以太坊、hyperledger等。
采用Go的一些国外公司,如Google、Docker、Apple、CloudFoundry、CloudFlare、Couchbase、CoreOS、Dropbox、MongoDB、AWS等公司;
采用Go开发的国内企业:如阿里云CDN、百度、小米、七牛、PingCAP、华为、金山软件、猎豹移动、饿了么等公司。
Docker
Docker是一种操作系统层面的虚拟化技术,可以在操作系统和应用程序之间进行隔离,也可以称之为容器。Docker可以在一台物理服务器上快速运行一个或多个实例。基于lxc的一个虚拟打包工具,能够实现PAAS平台的组建。例如,启动一个 CentOS操作系统,并在其内部命令行执行指令后结束,整个过程就像自己在操作系统一样高效。
项目链接:
https://github.com/docker/docker
go语言
Go 语言自己的早期源码使用C语言和汇编语言写成。从 Go 1.5 版本后,完全使用 Go语言自身进行编写。Go 语言的源码对了解 Go 语言的底层调度有极大的参考意义,建议希望对 Go 语言有深入了解的读者读一读。
项目链接:
Kubernetes
Google 公司开发的构建于 Docker 之上的容器调度服务,用户可以通过Kubernetes 集群进行云端容器集群管理。
项目链接:
https://github.com/kubernetes/kubernetes
etcd
一款分布式、可靠的 KV 存储系统,可以快速进行云配置。
项目链接:
https://github.com/coreos/etcd
beego
beego 是一个类似 Python的 Tornado 框架,采用了 RESTFul的设计思路,使用 Go 语言编写的一个极轻量级、高可伸缩性和高性能的 Web 应用框架。
项目链接:
https://github.com/astaxie/beego
martini
一款快速构建模块化的 Web 应用的 Web 框架。
项目链接:
https://github.com/go-martini/martini
codis
国产的优秀分布式 Redis 解决方案。
项目链接:
https://github.com/CodisLabs/codis
delve
Go语言
强大的调试器,被很多集成环境和编辑器整合。
项目链接:
https://github.com/derekparker/delve
Facebook也在用,为此他们还专门在Github上建立了一个开源组织facebookgo,大家可以通过https://github.com/facebookgo访问查看facebook开源的项目,比如著名的是平滑升级的grace。
腾讯
腾讯作为国内的大公司,还是敢于尝试的,尤其是Docker容器化这一块,他们在15年已经做了docker万台规模的实践,具体可以参考腾讯万台规模的Docker应用实践-InfoQ。
百度
目前所知的百度的使用是在运维这边,是百度运维的一个BFE项目,负责前端流量的接入。他们的负责人在2016年有分享,大家可以看下这个 InfoQ - 促进软件开发及相关领域知识与创新的传播-极客邦。
其次就是百度的消息系统。负责公司手百消息通讯系统服务器端开发及维护。
京东
京东云消息推送系统、云存储,以及京东商城等都有使用Go做开发。
小米
小米对Golang的支持,莫过于运维监控系统的开源,也就是 http://open-falcon.com/ 。
此外,小米互娱、小米商城、小米视频、小米生态链等团队都在使用Golang。
360
360对Golang的使用也不少,一个是开源的日志搜索系统Poseidon,托管在Github上,https://github.com/Qihoo360/poseidon.
还有360的推送团队也在使用,他们还写了篇博文在Golang的官方博客上 https://blog.golang.org/qihoo。
七牛云
七牛云用了近50万行代码,来实现整个产品。七牛云存储产品网址:七牛云 - 国内领先的企业级云服务商。上线时间:2011-9-1。应用范围:整个产品(包括基础服务、Web端、统计平台、各类小工具等等)Go代码行数占比:99.9%日 PV:保密
美团
美团后台流量支撑程序。应用范围:支撑主站后台流量(排序,推荐,搜索等),提供负载均衡,cache,容错,按条件分流,统计运行指标(qps,latency)等功能。
滴滴
基础服务平台。
金山微看
应用范围:服务接口,后台流程服务,消息系统,图片系统
搜狗
搜狗推送系统。Push系统中用于维持与客户端连接的部分。
QOR - 模块化的电商系统
- QOR官网: QOR: E-commerce & CMS SDK written in Go
- github地址: qor/qor · GitHub
- 应用范围: 整个产品
weico
产品名:weico 3.0, 服务端所有代码都是用Go实现。
仙侠道
- 产品网址:仙侠道官网 - 心动游戏
- 应用范围: 游戏服务端(通讯、逻辑、数据存储)
快玩游戏
- 网址:快玩小游戏,单机游戏,网页游戏,快玩游戏,快玩游戏盒
- 应用范围:实时消息系统、用户认证、用户会话、统一统计接口
盛大云CDN
- 网址:盛大云计算
- 应用范围:CDN的调度系统、分发系统、监控系统、短域名服务,CDN内部开放平台、运营报表系统以及其他一些小工具等
Bmob移动后端云服务平台
- 产品网址:Bmob移动后端云服务平台
- 应用范围:Restful API(使用Beego)、统计分析平台、常用服务如发邮件、队列异步处理、统计用户空间和接口请求
群策
- 网址:群策 - 统一团队沟通,高效完成工作
- 应用范围:全系统
BiddingX DSP广告投放系统
- 网址:BiddingX_专业的DSP解决方案供应商
- 应用范围:竞价投放、曝光统计、点击跳转
街坊四邻
- 网址:首页 - 街坊四邻
- 应用范围:后台服务
Leanote
- 网址:Leanote
Bearychat
- 网址:BearyChat
宅豆
- 网址:宅豆网 - 自筑最美家,宅豆随你搭
白板- 设计图讨论工具
- 网址:白板
实验楼
- 网址:实验楼 - 第一家以实验为核心的IT在线教育平台
新浪微博
中间件和弹性调度用 Java 和 Go 编写,微博视频转码及存储服务用 Go 编写。
爱奇艺
VR 后台系统中间件,VR 端的 HTTP 接口。
猎豹移动
消息推送
网易
网易蜂巢容器公有云。
哔哩哔哩
弹幕
巨人网络
部分手机游戏的服务端。
今日头条
Nsq:Nsq是由Go语言开发的高性能、高可用消息队列系统,性能非常高,每天能处理数十亿条的消息;
Packer:用来生成不同平台的镜像文件,例如VM、vbox、AWS等,作者是vagrant的作者
Skynet:分布式调度框架
Doozer:分布式同步工具,类似ZooKeeper
Heka:mazila开源的日志处理系统
Cbfs:couchbase开源的分布式文件系统
Tsuru:开源的PAAS平台,和SAE实现的功能一模一样
Groupcache:memcahe作者写的用于Google下载系统的缓存系统
God:类似redis的缓存系统,但是支持分布式和扩展性
Gor:网络流量抓包和重放工具
还有很多,比如阿里中间件、聚美优品、高升控股、探探、斗鱼直播、人人车、亚信、Udesk、方付通、招财猫、三一集团、美餐网等。一般的选择,都是选择用于自己公司合适的产品系统来做,比如消息推送的、监控的、容器的等,Golang特别适合做网络并发的服务,这是他的强项,所以也是被优先用于这些项目。Go语言作为一门大型项目开发语言,在很多大公司相继使用,甚至完全转向Go开发。
六,go语言的代码风格清晰,简单
Go语言语法类似于C语言,因此熟悉C语言及其派生语言(C++、C#、Objective-C等)的人都会迅速熟悉这门语言。
C语言的有些语法会让代码可读性降低甚至发生歧义。Go语言在C语言的基础上取其精华,弃其糟粕,将C语言中较为容易发生错误的写法进行调整,做出相应的编译提示。
1)去掉循环冗余括号
Go语言在众多大师的丰富实战经验的基础上诞生,去除了C语言语法中一些冗余、烦琐的部分。下面的代码是C语言的数值循环:
- // C语言的for数值循环
- for(int a = 0;a
- // 循环代码
- }
在Go语言中,这样的循环变为:
- for a := 0;a
- // 循环代码
- }
for 两边的括号被去掉,int 声明被简化为:=,直接通过编译器右值推导获得 a的变量类型并声明。
2)去掉表达式冗余括号
同样的简化也可以在判断语句中体现出来,以下是C语言的判断语句:
- if (表达式){
- // 表达式成立
- }
在Go语言中,无须添加表达式括号,代码如下:
- if 表达式{
- // 表达式成立
- }
3)强制的代码风格
Go语言中,左括号必须紧接着语句不换行。其他样式的括号将被视为代码编译错误。这个特性刚开始会使开发者有一些不习惯,但随着对Go语言的不断熟悉,开发者就会发现风格统一让大家在阅读代码时把注意力集中到了解决问题上,而不是代码风格上。
同时Go语言也提供了一套格式化工具。一些Go语言的开发环境或者编辑器在保存时,都会使用格式化工具对代码进行格式化,让代码提交时已经是统一格式的代码。
4)不再纠结于 i++ 和 ++i
C语言非常经典的考试题为:
- int a, b;
- a = i++;
- b = ++i;
这种题目对于初学者简直摸不着头脑。为什么一个简单的自增表达式需要有两种写法?
在Go语言中,自增操作符不再是一个操作符,而是一个语句。因此,在Go语言中自增只有一种写法:
i++
本章完结,谢谢大家耐心观看,下一章更新:go语言环境搭建。