01-Go语言介绍
Go语言介绍
Go 即Golang,是Google公司2009年11月正式对外公开的一门编程语言。
Go是静态强类型语言,是区别于解析型语言的编译型语言。
解析型语言——源代码是先翻译为中间代码,然后由解析器对代码进行解释执行。
编译型语言——源代码编译生成机器语言,然后由机器直接执行机器码即可执行。
Go语言特性
跨平台的编译型语言
语法接近C语言
管道(channel),切片(slice),并发(routine)
有垃圾回收的机制
支持面向对象和面向过程的编程模式
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 —— 实现的架构变化,同时保留了和旧版本的兼容性。
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支持。
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特别适合做网络并发的服务,这是他的强项,所以也是被优先用于这些项目。
应用领域
服务开发、并发、分布式、微服务等方向
Go语言项目
docker:基于lxc的一个虚拟打包工具,能够实现PAAS平台的组建。
kubernetes :Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡
区块链:BTCD 是用go语言实现的完整节点的比特币实现
nsq:bitly开源的消息队列系统,性能非常高,目前他们每天处理数十亿条的消息
packer:用来生成不同平台的镜像文件,例如VM、vbox、AWS等,作者是vagrant的作者
skynet:分布式调度框架
Doozer:分布式同步工具,类似ZooKeeper
Heka:mazila开源的日志处理系统
cbfs:couchbase开源的分布式文件系统
tsuru:开源的PAAS平台,和SAE实现的功能一模一样
groupcache:memcahe作者写的用于Google下载系统的缓存系统
god:类似redis的缓存系统,但是支持分布式和扩展性
gor:网络流量抓包和重放工具
Go语架构
GOPATH的工作区包含bin,src,和pkg这三个:
src——源码(包含第三方的和自己项目的)
bin——编译生成的可执行程序
pkg——编译时生成的对象文件
Go语言发展前景
Go语言将登上语言榜前列,与C和Java并列前三甲
Go语言称霸云计算
Go将统治下一个10年
Go语言为并发而生
在早期 CPU 都是以单核的形式顺序执行机器指令。Go语言的祖先C语言正是这种顺序编程语言的代表。顺序编程语言中的顺序是指:所有的指令都是以串行的方式执行,在相同的时刻有且仅有一个 CPU 在顺序执行程序的指令。
随着处理器技术的发展,单核时代以提升处理器频率来提高运行效率的方式遇到了瓶颈,单核 CPU 发展的停滞,给多核 CPU 的发展带来了机遇。相应地,编程语言也开始逐步向并行化的方向发展。
虽然一些编程语言的框架在不断地提高多核资源使用效率,例如 Java 的 Netty 等,但仍然需要开发人员花费大量的时间和精力搞懂这些框架的运行原理后才能熟练掌握。
作为程序员,要开发出能充分利用硬件资源的应用程序是一件很难的事情。现代计算机都拥有多个核,但是大部分编程语言都没有有效的工具让程序可以轻易利用这些资源。编程时需要写大量的线程同步代码来利用多个核,很容易导致错误。
Go语言正是在多核和网络化的时代背景下诞生的原生支持并发的编程语言。Go语言从底层原生支持并发,无须第三方库,开发人员可以很轻松地在编写程序时决定怎么使用 CPU 资源。
Go语言的并发是基于 goroutine 的,goroutine 类似于线程,但并非线程。可以将 goroutine 理解为一种虚拟线程。Go语言运行时会参与调度 goroutine,并将 goroutine 合理地分配到每个 CPU 中,最大限度地使用 CPU 性能。
多个 goroutine 中,Go语言使用通道(channel)进行通信,通道是一种内置的数据结构,可以让用户在不同的 goroutine 之间同步发送具有类型的消息。这让编程模型更倾向于在 goroutine 之间发送消息,而不是让多个 goroutine 争夺同一个数据的使用权。
程序可以将需要并发的环节设计为生产者模式和消费者的模式,将数据放入通道。通道另外一端的代码将这些数据进行并发计算并返回结果,如下图所示。
提示:Go语言通过通道可以实现多个 goroutine 之间内存共享。
【实例】生产者每秒生成一个字符串,并通过通道传给消费者,生产者使用两个 goroutine 并发运行,消费者在 main() 函数的 goroutine 中进行处理。
- package main
- import (
- "fmt"
- "math/rand"
- "time"
- )
- // 数据生产者
- func producer(header string, channel chan<- string) {
- // 无限循环, 不停地生产数据
- for {
- // 将随机数和字符串格式化为字符串发送给通道
- channel <- fmt.Sprintf("%s: %v", header, rand.Int31())
- // 等待1秒
- time.Sleep(time.Second)
- }
- }
- // 数据消费者
- func customer(channel <-chan string) {
- // 不停地获取数据
- for {
- // 从通道中取出数据, 此处会阻塞直到信道中返回数据
- message := <-channel
- // 打印数据
- fmt.Println(message)
- }
- }
- func main() {
- // 创建一个字符串类型的通道
- channel := make(chan string)
- // 创建producer()函数的并发goroutine
- go producer("cat", channel)
- go producer("dog", channel)
- // 数据消费函数
- customer(channel)
- }
运行结果:
dog: 2019727887
cat: 1298498081
dog: 939984059
cat: 1427131847
cat: 911902081
dog: 1474941318
dog: 140954425
cat: 336122540
cat: 208240456
dog: 646203300
对代码的分析:
- 第 03 行,导入格式化(fmt)、随机数(math/rand)、时间(time)包参与编译。
- 第 10 行,生产数据的函数,传入一个标记类型的字符串及一个只能写入的通道。
- 第 13 行,for{} 构成一个无限循环。
- 第 15 行,使用 rand.Int31() 生成一个随机数,使用 fmt.Sprintf() 函数将 header 和随机数格式化为字符串。
- 第 18 行,使用 time.Sleep() 函数暂停 1 秒再执行这个函数。如果在 goroutine 中执行时,暂停不会影响其他 goroutine 的执行。
- 第 23 行,消费数据的函数,传入一个只能写入的通道。
- 第 26 行,构造一个不断消费消息的循环。
- 第 28 行,从通道中取出数据。
- 第 31 行,将取出的数据进行打印。
- 第 35 行,程序的入口函数,总是在程序开始时执行。
- 第 37 行,实例化一个字符串类型的通道。
- 第 39 行和第 40 行,并发执行一个生产者函数,两行分别创建了这个函数搭配不同参数的两个 goroutine。
- 第 42 行,执行消费者函数通过通道进行数据消费。
整段代码中,没有线程创建,没有线程池也没有加锁,仅仅通过关键字 go 实现 goroutine,和通道实现数据交换。
GO语言适合做些什么?
其实Go语言主要用作服务器端开发,其定位是用来开发“大型软件”的,适合于需要很多程序员一起开发,并且开发周期较长的大型软件和支持云计算的网络服务。
Go语言融合了传统编译型语言的高效性和脚本语言的易用性和富于表达性,不仅提高了项目的开发速度,而且后期维护起来也非常轻松。
鉴于Go语言的特点和设计的初衷,从以下几个方面来分析Go语言擅长的领域:
- 在服务器编程方面,Go语言适合处理日志、数据打包、虚拟机处理、文件系统、分布式系统、数据库代理等;
- 网络编程方面,Go语言广泛应用于 Web 应用、API 应用、下载应用等;
- 此外,Go语言还可用于内存数据库和云平台领域,目前国外很多云平台都是采用 Go 开发。
除了上面介绍到的,Go语言还可以用来开发底层,例如以太坊、超级账本等都是基于Go语言开发的。
而且对于现在比较流行的区块链技术方面,Go语言也是非常受欢迎的,很多基于区块链的 DApps(去中心化应用)和工具都是用的Go语言来实现的。
下面列举了一些基于Go语言开发的优秀开源项目:
- 云计算基础设施领域,代表项目:docker、kubernetes、etcd、consul、cloudflare CDN、七牛云存储等。
- 基础软件,代表项目:tidb、influxdb、cockroachdb 等。
- 微服务,代表项目:go-kit、micro、monzo bank 的 typhon、bilibili 等。
- 互联网基础设施,代表项目:以太坊、hyperledger 等。
补充知识点
-go语言介绍
# -python,php,js -c,c+,c#:微软,java:sun公司,后来被甲骨文收购了,go:谷歌 -go语言发展:Google -2009年11月出的,python:1989年 java :1990 -Go是静态强类型语言:强类型:类型固定 -跨平台的编译型语言 -go为什么这么火? -docker容器化 devops 比较火 -k8s go写的:容器编排 -区块链 :第一个开源的区块链项目是用go写的 -性能高,特别适合服务端开发 -部署容易
Java补充知识点
# 补充: -c开发:在windows上开发,编译好的只能在windows上用 -java横空出世:跨平台,一处编码到处运行 -运行在java虚拟机之上 -编译成字节码文件:中间态 -go:跨平台编译 -在windows平台可以编译出linux下的可执行文件 # -java概念普及: -jdk:开发人员需要装jdk -jre:运行java程序,需要装 -jvm:java虚拟机 -javase:java基础,安卓方向 -javaee:javaweb方向 -ssh框架:spring structs Hibernate -ssm框架:spring springmvc mybatis -spring全家桶 -springboot:一站式搞定 -springclode:微服务开发 -javame:手机端开发 -大数据: django 对当次请求放到一个事务中 # 补充: 主流的ide(集成开发环境): -pycharm -idea:/my eclipse:java web开发,收费 /eclipse:免费 -goland -vs code:开发java,微软出的 -datagrip:数据库操作相关 -jetbrains 全家桶,它把市面上所有编程语言的开发工具都写了一遍