1. Go语言课程介绍
:::tips
我目前在 Mobvista 担任技术副总裁兼首席架构师,在加入 Mobvista 前我也担任过亚马逊(中国)、惠普等公司的首席软件架构师。
我呢是从小学四年级开始,接触计算机编程的,并一直从事至今的,用过很多的编程语言,像:BASIC、Pasic、Perl、Python、C、C++、Java、Lisp很多很多了,当然,也包括 Go 语言。 在 Mobvista 用 Go 语言构建了目前国内最大全球前十的移动互联网广告平台,这个平台每天处理着来自全球200多个国家和地区的 500 亿次请求。
我们为什么会想到用Go语言去构建这样一个平台呢?我觉得我们可以从Go语言本身的起源来看一下:那Go语言的雏形设想了始于2007年,当时Go的三位创始人,三位大牛,为了解决Google在软件开发中遇到的一些困难。他们主要是,这些困难,第一是多核软件架构,第二是超大规模的分布式计算集群,第三就是我们今天所广泛使用的web开发模式,导致前所未有的开发规模和更新速度。当然这些也是我们目前广大互联网公司所面临的问题。Go语言本身就是针对这些问题而设计的,所以越来越多的公司和组织,比如阿里、腾讯、百度、滴滴。众多的业界知名公司几乎都在自己的业务中使用了Go语言,包括前不久我也听说:知乎也舍弃了它们的Python转用Go重新构建他们的推荐系统。其实除了构建大规模的互联网系统之外吧,在业界,大家熟知的一些软件,例如说Docker、Kubernetes都是用Go来编写的,所以说Go也被称为云端开发语言,另外今天很著名的区块链项目,像以太坊、HYPERLEDGER这些都可以用Go来开发,所以说Go也是当之无愧的区块链开发语言,同时传统的企业应用 物联网应用,也都有Go的身影,Go语言的应用范围还在不断地扩展,所以你今天学习和掌握Go语言,对于你未来的职业发展和个人成长都有着非常重要的意义。从开发者的角度来讲,Go语言也有很多让开发人员喜欢的特性。首先就是简单,较之C语言的37个关键字、C++11多达84个关键字,Go语言只有区区25个关键字,另外特别是对一些复杂的任务,比如说并发编程、内存管理,Go语言都有内置的并发支持以及垃圾回收机制,第二当然是高效,Go语言作为一种编译的静态类型语言,尽管支持垃圾回收机制,但是你仍然可以使用指针去直接访问内存,第三是生产力,Go语言有简洁清晰的依赖管理以及独特的接口类型设计甚至是对一些编程方式的约束,如支持复合而不支持继承的扩展方式,这些都使得它成为一门极具生产力的语言,如果你有像PHP、Java、C/C+等一门或者多门语言的编程经验,现在想转到Go语言上,并且希望学完之后能快速地使用Go语言进行开发一些项目,那么这门课程非常适合你来学习,我们会从基本的Go的语言的语法讲起,并逐步过渡到进阶阶段,包括在开发中常见的并发任务的实现、常见架构模式,例如:pipe-filter、micro-kernel模式的实现,性能优化、高可用服务的实现等等,相信你在学习完本课程之后,你可以快速地开始使用Go语言,进行实际项目的开发。目前,我身边有不少有过其他语言基础的工程师开始学习Go语言,但是呢就像一名C程序员去学习C++一样,在原有的思维模式的影响的情况下,很多工程师学习Go语言会陷入很多的误区,很多人会写出用Go语言表示的C程序或者是Java程序。比如
:::
func foo() *int {
var i int
i = 10
return &i
}
:::tips 在C/C++的程序员眼里,看着是不是有严重的bug呢,可是在Go程序里,它是完全没有问题的。在实际的开发工作中,工程师们常常会陷入这样或那样的误区,首先呢是,他们会大量的使用共享内存的方来进行并发控制,而忽略了Go语言本身内置的CSP的并发机制,其次Java程序员在编写Go程序的时候,在方法调用间传递数组参数时,通常是直接传递数组,导致大量的内存复制,其实与Java不同,Go的数组参数是通过值赋值来进行传递的,另外Java程序员也总是喜欢创建一个只有接口定义的包,用于处理依赖关系,而其实这在Go中大可不必的。因为Go语言的接口的实现与接口的定义是没有依赖关系的,类似的问题太多了,针对这些问题,我个人在课程中,融入了个人及团队使用Go语言在实际项目开发中的一些经验和教训,并且通过大量的代码实例来讲解Go语言的特性以及与其他语言的特性进行一个比较,希望指出它们在编程和应用上的差异性,通过这门课程,我可以帮助那些有过其他语言编程基础的,特别是有C/C++、Java编程经验的工程师们打破已有的思维模式,快速地去掌握Go语言,有效地利用Go语言特性来进行实际项目的开发。
课程寄语
首先呢我当然是希望你们能喜欢我的课程和讲座,同时呢我也希望大家可以跟我多多地互动,给我留言,然后把你们遇到的问题和你们的收获都反馈给我,这样可以帮助到更多的人。我是蔡超,我在极客时间等你
:::
2. 内容综述
:::info 在去年我做过一个QCome的演讲,主要是针对于有Java和C/C++编程经验的工程师,讲解Go的并发编程,那在这个演讲之后呢,我收到了很多大家的正面的反馈,由此也让我感觉到,嗯,其实对于有一种编程经验的工程师来说,现在学习Go语言他们都有着极大的热情和需求。所以呢,我决定制作一个对于Go语言有更加全面和深入讲解的视频。嗯,作为一个有经验的编程人员,我们在学习Go语言的时候,我们通常会遇到的下面的一些问题,第一呢就是市面上的一些Go语言的教程,为了兼顾完全没有编程经验的人,所以说呢,它有些内容在学习的时候,我们会感觉有些浪费时间。另一方面呢,就是对于有经验的工程师来说,他掌握了一两种语言,它有一种固有的编程模式,那么在学习Go语言的时候呢,常常会陷入到以前的编程模式当中,常常会写出用其他语言来表示的Go语言,针对以上这些问题呢,我们制作了这个视频,是专门为那些有编程经验的程序员来开发的,特别是针对于那些有C/C++、或者Java编程经验的程序员,在视频的第一部分我们会带大家快速地学习Go语言的基本知识,并且和其他的主流编程语言进行比较,让大家真正的去掌握Go语言,编写真正的Go语言程序,第二部分可以说是我的实际工作的一个总结,那么我们会讲解在实践当中的一些Go语言的常见的任务,例如说常见的并发任务,以及常见的使用Go语言的难点和可能陷入的误区,同时呢我们也会讲解在开发大规模高可用系统当中的经验,让大家去学习大规模高可用开发和设计的要点,以及如何使用Go语言来开发一个高可用的大规模服务,相信通过这个视频的学习,大家不仅可以掌握Go语言编写更好的Go语言程序,也会学到大规模高可用系统设计和开发的要点,最终使用Go语言成功地开发一个大规模高可用的服务。 :::
3. Go语言简介:历史背景、发展现状及语言特性
在开始学习之前呢,我们会对Go语言的起源、Go语言的特点呢,做一个简单的介绍。 那其实Go语言呢是为了解决Google内部的一些自己开发当中面临的一些挑战,这样来诞生的,那么这些挑战包括什么呢?
- 多核硬件架构的广泛应用
- 超大规模分布式系统和集群
这个时候的分布式系统的集群的规模已经不是以前我们可以体会的几百台、几千台机器了, 那这个时候呢,是能达到上万台,甚至更大的规模
- Web模式下前所未有的开发规模和更新速度
和Google一样,Amazon,Netflix,全球每天都有上百名的工程师在7*24小时,从不同的地方去更新我们的大规模的服务和应用,这就带来了前所未有的挑战。
在开始正式的Go语言学习之前我们会对Go语言做一个简单的介绍,在Go语言的学习开始之前,我们会对Go语言的起源以及特点做一个大概的介绍。那Go语言呢,最初的雏形诞生于2007年的Google,当时Go语言发明是为了解决Google内部所发现的一些软件开发的一些问题挑战,第一呢就是多核架构的使用,越来越多的服务器采用了多核架构,第二呢就是超大规模的分布式集群,那集群的规模比以前大了很多,当然第三呢,是来自于像Google一样的Web模式所导致的前所未有的开发规模和更新速度,那全球成千上百的工程师7*24小时地不断去更新线上应用,这就带来了开发的效率以及大规模系统开发的协作的问题。Go语言的创始人呢可以说是Google的三位神人了,其实不仅仅是在Google,还是在整个业界,这三位来说都是一个传奇,第一位呢Rob Pike和另一位创始人:Ken Thompson是在贝尔实验室Unix的早期的创始人,Rob Pike也同时是UTF-8的创始人,那Thomspon也是C语言的创始人,同时还获得了1983年的图灵奖,另外一位比较年轻的呢 Robert Griesemer 其实也是很了不起的任务了,他是 Google V8 JS Engine、JVM Hot Spot 的开发者。那么三位创始人你就可以知道那Go语言基本上来说是一个出自大师之手的杰作了,可以这样认为,因为他们都是有很多年丰富编程经验的,根据他们在开发当中所遇到的困难,然后开发者所遇到的挑战,他们重新整理了Google的问题,然后设计出Go语言这样一种语言。
以下呢是一封邮件,是2007年Rob Pike给其他三位创始人发出来的一封邮件,这大致说了一下为什么会用Go这个名字,其实,他想说的就是go是一个很简单的一个名字,无论他作为后缀还是作为一个debug的工具,它都只有两个字母go,足够简单
从那个时候开始呢,到2009年Go语言出现了第一个版本,那么基本上都是Google的工程师利用他们的20%时间来去开发这个Go语言,所以Go语言本身呢也具有一些很显著的特点,那么我们现在来简单介绍一下。 第一个呢就是我们刚才说到的Go追求极致的简单,从关键字上我们就可以看出来,C有37个关键字,C++11呢有84个关键字,那Go呢,目前只有25个关键字,而且Go的创始人一直坚持Go语言会只有这些关键字
那另一个呢就是高效,Go呢是一种编译的强类型语言,那和Java不同的是Go在支持垃圾回收的同时,提供更高效的内存访问,Go也提供了使用指针进行直接的内存访问。
接下来就是生产力了,Go不仅有语法简洁,然后还有特别的接口类型,我们在后面会谈到,那同时Go还有些编程约束直接就为开发者做出了一些更好的选择,例如在程序的扩展上,那一般语言都会支持复合和继承。我们看到很多的面向对象编程的书都会谈到复合大于继承,然后解释这是为什么,在Go语言当中呢,直接就只支持了复合
那越来越多的应用呢都采用Go语言来开发我们常见的docker、Kubernetes,由于云端大量的使用Kubernetes和docker,所以说Go语言也被称为云计算语言
区块链是最近继AI以来最热门的话题了,那非常热门的以太网和HYPERLEDGER都是可以采用来进行开发的,所以Go语言也被称为区块链开发语言
说了这么多,那,大家可以准备一下,你的Go语言开发之旅了,第一呢我们就是安装和下载Go语言,大家可以通过以下的两个链接去安装和下载Go语言,如同Go语言的使用一样,他的安装也足够简单,在Go语言的安装和下载页面上,我们可以看到,针对于不同操作系统的安装包
install
,当然你也可以下载package或者是通过源代码编译直接安装,那最简单的方法呢,你直接下载install
,根据你的操作系统然后就像安装一个普通的应用软件一样,相当简单的下一步下一步就可以完成了。至于IDE呢,目前大多数的IDE都可以支持Go语言开发,那你只需要安装Go语言的插件就可以了,那你可以使用VS Code任何你喜欢的IDE,在课程当中我使用了我喜欢的Atom来作为Go语言开发的IDE、那我装了一个go-plus的这个开发的一个插件,我们简单看一下这个插件的安装。后面的文本略……由于Github宣布于今年的12月15日归档Atom及其旗下项目,故本篇blog(其实也可以说成是学习笔记)不采用Atom作为开发工具,选用GoLand作为 IDE。关于如何下载安装,请自行寻找网上教程,学生党可申请免费使用,其他人可自行寻找相应的 IDE 即可,不做过多赘述。 博主所采用的是 **
4. 编写第一个Go程序
好,那么今天正式开始,Go语言冒险之旅。那依照所有程序学习的惯例,我们都会从编写一个
helloworld
开始,但即便是helloworld
,这样一个简单的应用程序。里面涉及到的应用程序入口,大家也会发现,和我们的,Java、C/C++ 这些主流编程语言,有很大的不同。首先呢是开发环境的一个简单的设置,在Go1.8版本以前呢,我们必须去设置这个GOPATH这个环境变量,那么,大家在安装完Go以后呢,新的Go的版本呢,应该都是在1.8以后的,你可以通过,下面这个命令行来检查一下你Go的版本go version
那,最新安装的Go的版本呢是1.11.5,那是Go1.8以后的版本,所以呢,我们就没有必要去来设置这个GOPATH这个环境变量,在以后的课程中,我们可能会涉及到去设置这个环境变量,那到那个部分的时候呢,我们会给大家讲一下我们如何去手动设置它。接下来呢,我们创建一个目录,我们今后的这些编程任务呢,我们都把他放在这个目录下
mkdir go_learning
…暂时不写了,有点耗费时间。先倍速看,有空打字幕进行翻译
个人IDE的一些截图
已经在go env中设置好了 GOPROXY=[https://goproxy.cn,direct](https://goproxy.cn,direct)
,这里不另外设置了。
# win下cmd打开设置即可
go env -w GOPROXY=https://goproxy.cn,direct