写点什么

千字真言,字字珠玑,我的 Golang 学习笔记,赤诚分享

发布于: 2021 年 08 月 20 日

前言

本文涉及 Golang 资料:


Go 语言参考手册.pdf

Golang 入门笔记.pdf

Golang 新手可能会踩的 50 个坑.pdf

Golang基础框架图.png

Golang知识点归纳.png

Golang精编100题.md

Go基础语法宝典.pdf

Go自带库的使用说明.md

Rob Pike谈Google Go.md

Uber Go 语言编码规范中文版.md

一、源码下载

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.iohttps://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

三、书籍准备

入门

《Go 入门指南》

《Go语言101》

《Go语言学习笔记》

《Go语言入门经典》:hdcy

《Go语言编程》

《Go语言实战》

《Go Web 编程》

《Go语言编程入门与实战技巧》:sgro

进阶

《Go 语言圣经》

《Go专家编程》

《Go 语法树入门》

《Go语言程序设计》:flnj

《Go语言高级编程》

《Go语言核心编程》:v9fl

《Go并发编程实战》第2版:lsn0

《Go语言并发之道》:6ppw

四、源代码目录结构



五、知识点归纳

这里我给大家整理归纳为四大块,分别是语法中间件后端开发云原生

我们通过这个四个板块的学习,逐步进阶成一个可以从事后端服务器开发的工程师。

下面我们简单介绍中间件和云原生:

中间件

MySQL、Redis、MongoDB、Kafka 这些常见的中间件,这里我们不做赘述。我们着重简述下 Gin、etcd、ElasticSearch、gRPC。

  • GinGin 是一个用 Go (Golang)编写的 HTTP web 框架。它具有一个类似 martinii 的 API,性能要好得多——快了 40 倍。

官方 Github 项目:https://github.com/gin-gonic/gin

  • etcdEtcd 是一种强一致性的分布式键值存储,它提供了一种可靠的方法来存储需要被分布式系统或机器集群访问的数据。它可以在网络分区期间优雅地处理 leader 选举,并且可以容忍机器故障,即使是 leader 节点。

官网:https://etcd.io/

  • ElasticSearchElasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。 作为 Elastic Stack 的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。

官网:https://www.elastic.co/cn/elasticsearch/

  • gRPCgRPC 是一个现代的开源高性能远程过程调用(Remote Procedure Call, RPC)框架,可以在任何环境中运行。通过对负载平衡、跟踪、运行状况检查和身份验证的可插拔支持,它可以有效地连接数据中心内和跨数据中心的服务。它也适用于分布式计算的最后一英里,将设备、移动应用程序和浏览器连接到后端服务。

官网:https://grpc.io/

云原生

  • 微服务微服务是一种软件架构风格,它是以专注于单一责任与功能的小型功能区块为基础,利用模块化的方式组合出复杂的大型应用程序,各功能区块使用与语言无关的 API 集相互通信。

  • DevOpsDevOps 是一种重视“软件开发人员”和“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 容器服务

用户头像

直奔腾讯去,一起学习:Q群654378476 2021.05.20 加入

我要学完第十代《Linux C/C++服务架构开发》知识体系里的内容,直奔腾讯去,一起学习:Q群654378476 系统学习免费课程:https://ke.qq.com/course/417774?flowToken=1033508

评论

发布
暂无评论
千字真言,字字珠玑,我的Golang学习笔记,赤诚分享