千字真言,字字珠玑,我的Golang学习笔记,赤诚分享
-
前言
本文涉及Golang资料:
一、源码下载
Go官网下载地址:https://golang.org/dl/
Go官方镜像站(推荐):https://golang.google.cn/dl/
二、搭建Go语言开发环境
版本的选择
Windows平台和Mac平台推荐下载可执行文件版,Linux平台下载压缩文件版。
下图中的版本号可能并不是最新的,但总体来说安装教程是类似的。Go语言更新迭代比较快,推荐使用较新版本,体验最新特性。
安装
Windows安装
此安装实例以 64位Win10系统安装 Go1.14.1可执行文件版本为例。
将上一步选好的安装包下载到本地。
双击下载好的文件,然后按照下图的步骤安装即可。
Linux下安装
如果不是要在Linux平台敲go代码就不需要在Linux平台安装Go,我们开发机上写好的go代码只需要跨平台编译(详见文章末尾的跨平台编译)好之后就可以拷贝到Linux服务器上运行了,这也是go程序跨平台易部署的优势。
我们在版本选择页面选择并下载好go1.14.1.linux-amd64.tar.gz文件:
wget https://dl.google.com/go/go1.14.1.linux-amd64.tar.gz
将下载好的文件解压到/usr/local目录下:
tar -zxvf go1.14.1.linux-amd64.tar.gz -C /usr/local # 解压
如果提示没有权限,加上sudo以root用户的身份再运行。执行完就可以在/usr/local/下看到go目录了。
配置环境变量: Linux下有两个文件可以配置环境变量,其中/etc/profile是对所有用户生效的;$HOME/.profile是对当前用户生效的,根据自己的情况自行选择一个文件打开,添加如下两行代码,保存退出。
export GOROOT=/usr/local/go export PATH=$PATH:$GOROOT/bin
修改/etc/profile后要重启生效,修改$HOME/.profile后使用source命令加载$HOME/.profile文件即可生效。 检查:
~ go version go version go1.14.1 linux/amd64
Mac下安装
下载可执行文件版,直接点击下一步安装即可,默认会将go安装到/usr/local/go目录下。
检查
上一步安装过程执行完毕后,可以打开终端窗口,输入go version命令,查看安装的Go版本。
GOROOT和GOPATH
GOROOT和GOPATH都是环境变量,其中GOROOT是我们安装go开发包的路径,而从Go 1.8版本开始,Go开发包在安装完成后会为GOPATH设置一个默认目录,并且在Go1.14及之后的版本中启用了Go Module模式之后,不一定非要将代码写到GOPATH目录下,所以也就不需要我们再自己配置GOPATH了,使用默认的即可。
GOPROXY 非常重要
Go1.14版本之后,都推荐使用go mod模式来管理依赖环境了,也不再强制我们把代码必须写在GOPATH下面的src目录了,你可以在你电脑的任意位置编写go代码。(网上有些教程适用于1.11版本之前。)
默认GoPROXY配置是:GOPROXY=https://proxy.golang.org,direct,由于国内访问不到https://proxy.golang.org,所以我们需要换一个PROXY,这里推荐使用https://goproxy.io或https://goproxy.cn。
可以执行下面的命令修改GOPROXY:
go env -w GOPROXY=https://goproxy.cn,direct
Go开发编辑器
Go采用的是UTF-8编码的文本文件存放源代码,理论上使用任何一款文本编辑器都可以做Go语言开发,这里推荐使用VS Code和Goland。 VS Code是微软开源的编辑器,而Goland是jetbrains出品的付费IDE。
我们这里使用VS Code 加插件做为go语言的开发工具。
VS Code介绍
VS Code全称Visual Studio Code,是微软公司开源的一款免费现代化轻量级代码编辑器,支持几乎所有主流的开发语言的语法高亮、智能代码补全、自定义热键、括号匹配、代码片段、代码对比 Diff、GIT 等特性,支持插件扩展,支持 Win、Mac 以及 Linux平台。
虽然不如某些IDE功能强大,但是它添加Go扩展插件后已经足够胜任我们日常的Go开发。
下载与安装
VS Code官方下载地址:https://code.visualstudio.com/Download
三大主流平台都支持,请根据自己的电脑平台选择对应的安装包。
双击下载好的安装文件,双击安装即可。
配置
安装中文简体插件
点击左侧菜单栏最后一项管理扩展,在搜索框中输入chinese ,选中结果列表第一项,点击install安装。
安装完毕后右下角会提示重启VS Code,重启之后你的VS Code就显示中文啦!
VSCode主界面介绍:
安装go扩展
现在我们要为我们的VS Code编辑器安装Go扩展插件,让它支持Go语言开发。
第一个Go程序
Hello World
现在我们来创建第一个Go项目——hello。在我们桌面创建一个hello目录。
go mod init
使用go module模式新建项目时,我们需要通过go mod init 项目名命令对项目进行初始化,该命令会在项目根目录下生成go.mod文件。例如,我们使用hello作为我们第一个Go项目的名称,执行如下命令。
go mod init hello
编写代码
接下来在该目录中创建一个main.go文件:
package main // 声明 main 包,表明当前是一个可执行程序 import "fmt" // 导入内置 fmt 包 func main(){ // main函数,是程序执行的入口 fmt.Println("Hello World!") // 在终端打印 Hello World! }
非常重要!!! 如果此时VS Code右下角弹出提示让你安装插件,务必点 install all 进行安装。
编译
go build命令表示将源代码编译成可执行文件。
在hello目录下执行:
go build
或者在其他目录执行以下命令:
go build hello
go编译器会去 GOPATH的src目录下查找你要编译的hello项目
编译得到的可执行文件会保存在执行编译命令的当前目录下,如果是windows平台会在当前目录下找到hello.exe可执行文件。
可在终端直接执行该hello.exe文件:
c:\desktop\hello>hello.exe Hello World!
我们还可以使用-o参数来指定编译后得到的可执行文件的名字。
go build -o heiheihei.exe
Windows下VSCode切换cmd.exe作为默认终端
如果你打开VS Code的终端界面出现如下图场景(注意观察红框圈中部分),那么你的VS Code此时正使用powershell作为默认终端:
十分推荐你按照下面的步骤,选择cmd.exe作为默认的终端工具:
此时,VS Code正上方中间位置会弹出如下界面,参照下图挪动鼠标使光标选中后缀为cmd.exe的那一个,然后点击鼠标左键。
最后重启VS Code中已经打开的终端或者直接重启VS Code就可以了。
如果没有出现下拉三角,也没有关系,按下Ctrl+Shift+P,VS Code正上方会出现一个框,你按照下图输入shell,然后点击指定选项即可出现上面的界面了。
go run
go run main.go也可以执行程序,该命令本质上也是先编译再执行。
go install
go install表示安装的意思,它先编译源代码得到可执行文件,然后将可执行文件移动到GOPATH的bin目录下。因为我们的环境变量中配置了GOPATH下的bin目录,所以我们就可以在任意地方直接执行可执行文件了。
跨平台编译
默认我们go build的可执行文件都是当前操作系统可执行的文件,如果我想在windows下编译一个linux下可执行文件,那需要怎么做呢?
只需要指定目标操作系统的平台和处理器架构即可,例如Windows平台cmd下按如下方式指定环境变量。
SET CGO_ENABLED=0 // 禁用CGO SET GOOS=linux // 目标平台是linux SET GOARCH=amd64 // 目标处理器架构是amd64
注意:如果你使用的是PowerShell终端,那么设置环境变量的语法为$ENV:CGO_ENABLED=0。
然后再执行go build命令,得到的就是能够在Linux平台运行的可执行文件了。
Mac 下编译 Linux 和 Windows平台 64位 可执行程序:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build
Linux 下编译 Mac 和 Windows 平台64位可执行程序:
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build
Windows下编译Mac平台64位可执行程序:
SET CGO_ENABLED=0 SET GOOS=darwin SET GOARCH=amd64 go build
三、书籍准备
入门
进阶
四、源代码目录结构
文件名 文件属性 AUTHORS 文件,官方 Go语言作者列表 CONTRIBUTORS 文件,第三方贡献者列表 LICENSE 文件,Go语言发布授权协议 PATENTS 文件,专利 README 文件,README文件,大家懂的。提一下,经常有人说:Go官网打不开啊,怎么办?其实,在README中说到了这个。该文件还提到,如果通过二进制安装,需要设置GOROOT环境变量;如果你将Go放在了/usr/local/go中,则可以不设置该环境变量(Windows下是C:\go)。当然,建议不管什么时候都设置GOROOT。另外,确保$GOROOT/bin在PATH目录中。 VERSION 文件,当前Go版本 api 目录,包含所有API列表,方便IDE使用 doc 目录,Go语言的各种文档,官网上有的,这里基本会有,这也就是为什么说可以本地搭建”官网”。这里面有不少其他资源,比如gopher图标之类的。 favicon .ico文件,官网logo include 目录,Go 基本工具依赖的库的头文件 lib 目录,文档模板 misc 目录,其他的一些工具,相当于大杂烩,大部分是各种编辑器的Go语言支持,还有cgo的例子等 robots txt文件,搜索引擎robots文件 src 目录,Go语言源码:基本工具(编译器等)、标准库 test 目录,包含很多测试程序(并非_test.go方式的单元测试,而是包含main包的测试),包括一些fixbug测试。可以通过这个学到一些特性的使用。 五、知识点归纳
这里我给大家整理归纳为四大块,分别是语法、中间件、后端开发、云原生。
我们通过这个四个板块的学习,逐步进阶成一个可以从事后端服务器开发的工程师。
下面我们简单介绍中间件和云原生:
中间件
MySQL、Redis、MongoDB、Kafka这些常见的中间件,这里我们不做赘述。我们着重简述下Gin、etcd、ElasticSearch、gRPC。
- Gin Gin是一个用Go (Golang)编写的HTTP web框架。它具有一个类似martinii的API,性能要好得多——快了40倍。 官方Github项目:https://github.com/gin-gonic/gin
- etcd Etcd是一种强一致性的分布式键值存储,它提供了一种可靠的方法来存储需要被分布式系统或机器集群访问的数据。它可以在网络分区期间优雅地处理leader选举,并且可以容忍机器故障,即使是leader节点。 官网:https://etcd.io/
- ElasticSearch Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。 作为 Elastic Stack 的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。 官网:https://www.elastic.co/cn/elasticsearch/
- gRPC gRPC是一个现代的开源高性能远程过程调用(Remote Procedure Call, RPC)框架,可以在任何环境中运行。通过对负载平衡、跟踪、运行状况检查和身份验证的可插拔支持,它可以有效地连接数据中心内和跨数据中心的服务。它也适用于分布式计算的最后一英里,将设备、移动应用程序和浏览器连接到后端服务。 官网:https://grpc.io/
云原生
- 微服务 微服务是一种软件架构风格,它是以专注于单一责任与功能的小型功能区块为基础,利用模块化的方式组合出复杂的大型应用程序,各功能区块使用与语言无关的API集相互通信。
- DevOps DevOps是一种重视“软件开发人员”和“IT运维技术人员”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。
- 持续部署 持续部署,是一种软件工程方法,意指在软件开发流程中,以自动化方式,频繁而且持续性的,将软件部署到生产环境中,使软件产品能够快速的发展。 持续部署可以整合到持续整合与持续交付(Continuous delivery)的流程之中。
- 容器化 容器化是软件开发的一种方法,通过该方法可将应用程序或服务、其依赖项及其配置(抽象化为部署清单文件)一起打包为容器映像。 容器化应用程序可以作为一个单元进行测试,并可以作为容器映像实例部署到主机操作系统 (OS)。
六、如何高效地学习Go?
想要高效地的学习Golang,单单知道学习哪几个板块,是远远不够的。我们还需要将每个板块的知识点进一步细化。 ——成功与失败之间,最重要的是不容忽视的细节
语法
- 语法基础
- 错误处理
- 包定义以及导入
- 结构体
- 反射原理
- 值传递、引用传递、defer函数
- 并发编程
- goroutine
- 锁
- 通道channel
- runtime包
- Context使用原则
- 网络编程
- tcp/udp编程
- http实现
- websocket
- 源码掌握
- GC机制
- 调度器
- 定时器
- map与切片
- 第三方测试框架
- goconvey
- gostub
- gomock
- monkey
中间件
- MySQL
- golang的CRUD
- jmorion/sqlx包
- 连接池
- 异步mysql
- Gin
- RESTful API
- URL查询参数
- query接收数组和Map
- 表单参数
- 上传文件
- 分组路由routel以及中间件授权
- json、struct、xml、yaml、protobuf渲染
- Redis
- go-redis
- get/set/zset操作
- 连接池
- 分布式锁
- MongoDB
- MongoDB-driver
- BSON解析
- CRUD操作
- 文档管理
- 连接池
- Kafka
- saram包
- 同步、异步
- zstd压缩算法
- 横向扩展
- go实现生产消费者
- topic和partition
- 消息分发策略
- 分区副本机制
- etcd
- 原理
- 分布式锁
- etcd操作
- 服务发现于注册
- ElasticSearch
- es服务器
- go- elasticsearch包
- node于cluster
- Index于Document
- 检测与配置
- gRPC
- protoc-gen-go开发包
- .proto文件
- gRPC Service Stub
- rpc接口设计
- 通信模式
- 拦截器
- 多路复用
- 负载均衡
- 安全认证
后端开发
- 游戏后端
- leaf框架
- 网关、协议、日志、网络模块
- 流媒体Web后端
- Restful接口设计
- scheduler设计
- apidefs结构体
- mysql建库建表
- 小程序后端
- 公众号开发流程
- 微信消息接收与解析
- 公众号验证URL+Token
- 内网环境接口测试
- 后端程序测试脚本
- goadmin后台权限管理系统
- RESTful API设计
- Gin框架
- JWT认证
- 支持Swagger文档
- GORM对象关系映射
- 基于Casbin的RBAC访问控制模型
- goim千万级高并发推送服务
- 单个、多个、广播消息推送
- 应用心跳、tcp、keepalive、http log pulling
- 异步消息推送
- 接入层多协议
- 可拓扑架构
- 注册发现服务
- 消息协议(protobuf)
- goim推送
- grpc编程
- 腾讯云大数据
- TBDS
- 云数据仓库PostgreSQL
- 弹性MapReduce
- WeData数据开发平台
云原生
- 微服务
- go-micro原理
- rpc
- 服务间同步
- json/protobuf
- DevOps
- 项目管理 CODING-PM
- 测试管理 CODING-TM
- 制品库 CODING-AR
- 代码托管 CODING-CR
- 持续部署
- spinnake
- webhook外部对接
- 蓝绿分布/金丝雀发布
- SCF云函数
- 快速回滚
- 容器化
- Docker化部署
- k8s集群
- CVM云服务器
- TKE容器服务