1. 学习基础知识
学习 Go 的常见概念,如变量、循环、条件语句、函数、数据类型等。Go 基础的一个好起点是官方文档。
- 官方 Go 教程
- 文章 W3 Schools Go 教程
- 订阅 探索关于 Golang 的热门文章
◇基本语法
学习 Go 的基本语法,例如 Go 程序的执行方式、包导入、主函数等。
◇Go 中的变量
变量是为存储特定类型值的内存位置指定的名称。Go 提供了多种声明和使用变量的方式。
- 官方 Go 变量
- 文章 Go by Example: 变量
- 文章 w3schools Go 变量
◇数据类型(bool | int, int8/16/32/64 | byte | unit, unit8/16/32/64 | rune | float32/64 | complex64/128 | unitptr)
Go 是一种静态类型编程语言,这意味着每个变量在定义时都有一个类型,并且只能保存该类型的值。Go 中的类型分为两类:基本类型和复合类型。
◇For 循环
Go 只有一种循环结构,即 for
循环。基本的 for
循环由三个部分组成,用分号分隔:
-
初始化语句:在第一次迭代前执行
-
条件表达式:在每次迭代前评估
-
后置语句:在每次迭代结束时执行
-
官方 Go 中的 For 循环
◇Range
range
用于与 for
循环一起迭代数组、字符串和其他数据结构中的每个元素。
- 官方 Go 范围
- 文章 Go by Example: Range
- 文章 Go 范围基本模式
◇条件语句
条件语句用于仅在某个条件为真时运行代码。Go 支持:
-
if
语句 -
if...else
语句 -
switch...case
语句
◇错误/Panic/Recover
Go 的创建者没有添加异常处理程序,而是利用了 Go 返回多个值的能力。Go 中最常用的错误处理技术是将错误作为返回值的最后一个值返回。
panic
通常意味着发生了意外的错误。主要用于在正常操作期间不应发生的错误上快速失败,或者我们无法优雅处理的错误。
Go 中的 panic
恢复依赖于语言的一个特性,称为延迟函数。Go 能够保证在父函数返回时执行一个函数。无论父函数返回的原因是返回语句、函数块结束还是 panic
,都会发生这种情况。
- 官方 错误处理与 Go
- 官方 Go Defer, Panic 和 Recover
- 文章 Go 中的有效错误处理
◇函数,多返回值/命名返回值
函数是执行特定任务的代码块。它是一个可重用的代码单元,可以从程序的其他部分调用。函数帮助您组织代码,使其更具模块化,并提高可读性。
- 官方 Effective Go: 函数
- 文章 Go by Example: 函数
- 文章 Go 中的函数
◇包、导入和导出
包是 Go 语言中最强大的部分。包的目的是通过将相关功能分组到单个单元中来设计和维护大量程序,以便它们易于维护和理解,并且独立于其他包程序。这种模块化允许它们共享和重用。在 Go 语言中,每个包都用不同的名称定义,并且该名称接近其功能,例如“strings”包,它只包含与字符串相关的方法和函数。
- 官方 Go 包浏览器
- 官方 标准库
- 官方 如何在 Go 中管理外部依赖
- 文章 如何在 Go 中创建包
◇类型转换
Go 不支持自动类型转换,但允许类型转换,即显式更改变量类型的过程。
- 官方 Go 之旅:类型转换基础
- 文章 Go 文档:类型转换
◇类型推断
类型推断使 Go 能够在没有明确指示的情况下检测值的类型,因此可以在不首先提供其类型的情况下声明变量。
- 官方 Go 之旅:类型推断
- 文章 Go 变量:类型推断
◇数组
在 Go 中,数组
是具有 固定 大小的相同类型元素的集合,数组在创建时定义大小。
- 官方 Go 数组
- 官方 Effective Go: 数组
- 视频 学习 Go 编程 - 数组
◇切片
切片与数组类似,但更强大和灵活。与数组一样,切片也用于在单个变量中存储多个相同类型的值。然而,与数组不同,切片的长度可以根据需要增长和缩小。
- 官方 Go 切片
- 官方 Effective Go: 切片
- 文章 Go 中的切片
- 视频 学习 Go 编程 - 切片
◇映射
映射是 Go 中的数据结构,当我们需要在键值对之间建立映射时使用。它们在添加或删除元素方面具有灵活性。映射不允许重复条目,同时数据保持无序。
◇make()
Go 的内置函数 make
帮助我们根据提供给函数的参数创建和初始化切片、映射和通道。
- 官方 Effective Go: 使用 make 分配
- 文章 使用 make 创建切片
- 文章 使用 make 创建映射
- 文章 使用 make 创建通道
◇结构体
结构体是用户定义的类型,帮助我们创建描述单个实体的数据集合。
- 官方 Go 结构体
- 文章 Go by Example: 结构体
- 视频 Go 中的结构体
- 视频 结构体标签和通过反射创建自己的标签
2. 深入探索
深入探索 Golang 涉及探索该语言的更高级功能和最佳实践,以充分发挥其潜力。一旦掌握了基础知识,进一步的知识提升包括理解 Go 的复杂方面,这些方面可以显著提高代码的性能、可读性和可维护性。
- 文章 掌握高级 GO
◇Go 模块
Go 模块是一组相关的包,它们一起进行版本控制和分发。它们指定了我们项目的要求,列出了所有必需的依赖项,并帮助我们跟踪已安装依赖项的具体版本。
- 官方 Go 模块
- 文章 DigitalOcean: 如何使用 Go 模块
- 视频 Go 模块
- 动态 探索关于 Golang 的热门帖子
◇JSON 的序列化与反序列化
JSON(JavaScript 对象表示法)是一种简单的数据交换格式。在语法上,它类似于 JavaScript 的对象和列表。它最常用于 Web 后端和浏览器中运行的 JavaScript 程序之间的通信,但也用于许多其他地方。
- 官方 JSON
- 文章 Golang 中的 JSON 指南
- 文章 JSON 转 GO
- 文章 在 Go 中使用 JSON 的综合指南
◇类型、类型断言、Switch
Golang 中的类型指定了有效的 Go 变量可以保存的数据类型。Golang 有四种类型类别,包括基本类型、聚合类型、引用类型和接口类型。Golang 中的类型断言提供了对接口变量确切类型的访问。
- 官方 类型断言
- 视频 Go 语法 - 类型断言
◇接口
Go 中的接口是一种定义了一组方法的类型。如果我们有一个类型(例如结构体)实现了这组方法,那么我们就有一个实现了该接口的类型。
- 官方 Go 接口
- 官方 Effective Go: 接口
- 文章 Go by Example: 接口
- 视频 Golang 教程 #22 - 接口(由 Tech With Tim 在 YouTube 上发布)
- 视频 理解 Go 接口
◇Context
context
包提供了一种标准方式来解决在请求期间管理状态的问题。该包满足了请求范围数据的需求,并提供了一种标准化的方式来处理:截止时间、取消信号等。
- 官方 Go Context
- 文章 Go by Example: Context
- 文章 Digital Ocean: 如何在 Go 中使用 Context
- 视频 Go 中的 Context
- 视频 理解 Go 中的 Context
◇Goroutines
Goroutines 允许我们在 Go 中编写并发程序。像处理数千个请求的 Web 服务器或在渲染新页面的同时并发进行网络请求的网站,这些都是并发的例子。在 Go 中,这些并发任务被称为 Goroutines
。
- 官方 Goroutines
- 官方 Effective Go: Goroutines
- 文章 Go by Example: Goroutines
- 视频 Goroutines
- 视频 理解并发
- 动态 探索关于 Golang 的热门帖子
◇Channels
Channels 是连接并发 goroutines 的管道。您可以从一个 goroutine 向 channels 发送值,并在另一个 goroutine 中接收这些值。
Channels 是一种类型化的管道,您可以使用通道操作符 <-
发送和接收值。
- 官方 Channels
- 官方 Effective Go: Channels
- 文章 Go by Example: Channels
- 文章 Golang 中的 Channels
- 视频 Channels
- 视频 你必须知道的 Golang Channel 基础知识!
◇Buffer
buffer
属于 Go 语言的字节包,我们可以使用这些包来操作字符串的字节。
◇Select
select
语句让一个 goroutine 等待多个通信操作。
select
会阻塞,直到其中一个 case 可以运行,然后执行该 case。如果多个 case 准备就绪,它会随机选择一个。select
语句就像 switch 语句,但在 select 语句中,case 语句指的是通信,即通道上的发送或接收操作。
- 官方 Select
- 文章 Go by Example: Select
- 视频 Select 语句
◇Mutex
Go 允许我们使用 goroutines 并发运行代码。然而,当并发进程访问同一块数据时,可能会导致竞态条件。Mutexes 是由 sync 包提供的数据结构。它们可以帮助我们在数据的不同部分上放置锁,以便一次只有一个 goroutine 可以访问它。
- 文章 在 Go 中使用 Mutex 的示例
- 文章 Sync 包
◇Scheduler
Go Scheduler 让我们更深入地了解 Golang 的内部工作原理。在逻辑处理器、核心、线程、池缓存、上下文切换等方面。Go 调度器是 Go 运行时的一部分,而 Go 运行时内置在您的应用程序中。
- 文章 操作系统调度器 - 1
- 文章 Go 调度器 - 2
- 文章 Go 运行时调度器的图解故事
- 视频 Go 调度器:实现轻量级并发语言
◇泛型
Go 泛型是一项功能,允许您编写可以处理任何类型的函数、数据结构和算法。这是一项强大的功能,可以帮助您编写更灵活和可重用的代码。
- 官方 泛型
- 官方 Go 博客:泛型
- 文章 Go by Example: 泛型
- 视频 泛型解释
◇指针
Go 指针是一项强大的功能,允许您直接处理内存地址。它们用于存储变量的内存地址。当您需要将大量数据传递给函数或需要在函数内部修改变量的值时,这可能很有用。
- 官方 指针
- 文章 Go by Example: 指针
- 视频 YouTube: 指针
3. 构建CLI应用程序
命令行界面(CLI)与图形用户界面(GUI)不同,它是纯文本的。由于易于自动化和远程操作,云和基础设施应用程序主要基于CLI。
Go应用程序被构建为单一的自包含二进制文件,这使得安装Go应用程序变得非常简单;特别是,用Go编写的程序可以在任何系统上运行,而不需要任何现有的库、运行时或依赖项。而且,用Go编写的程序具有即时启动时间——类似于C或C++,但其他编程语言无法实现。
- 官方 命令行界面(CLI)
- 动态 探索关于Golang的热门帖子
◇Cobra
Cobra是一个用于创建强大的现代CLI应用程序的库。
- 官方 Cobra 网站
- 开源 Cobra Github
- 文章 Cobra 包文档
- 视频 如何编写漂亮的Golang CLI
◇Urfave CLI
Urfave CLI 是一个简单、快速且有趣的包,用于在Go中构建命令行应用程序。
- 开源 Urfave CLI
- 文章 Urfave 网站
- 文章 如何在Go中构建CLI
- 文章 使用urfave cli构建CLI
- 动态 探索关于CLI的热门帖子
4. ORMs
在计算机科学中,对象关系映射(ORM, O/RM, 和 O/R 映射工具)是一种使用面向对象编程语言在类型系统之间转换数据的编程技术。这实际上创建了一个“虚拟对象数据库”,因此是一个抽象层,可以从编程语言中使用。Go中最常见的ORM库是GORM。
◇GORM
GORM 是一个极好的Golang ORM库,旨在对开发者友好。它是一个用于处理关系数据库的ORM库。这个gorm库是在database/sql包的基础上开发的。ORM的概述和特性是:全功能ORM(几乎)
- 官方 Gorm
- 文章 Gorm 包
- 视频 GORM 和 MYSQL
5. Web框架
有几个著名的Go Web框架。最常见的包括:
-
Beego
-
Gin
-
Revel
-
Echo
-
GoFiber
-
开源 Web框架比较
◇Beego
Beego 用于快速开发Go中的企业应用程序,包括RESTful API、Web应用程序和后端服务。它受到Tornado、Sinatra和Flask的启发。beego具有一些Go特定的功能,如接口和结构体嵌入。
- 开源 Beego/Beego
◇Gin
Gin 是一个用Golang(Go)编写的高性能HTTP Web框架。Gin有一个类似于martini的API,并声称速度提高了40倍。Gin允许你在Go中构建Web应用程序和微服务。
- 开源 Gin
- 文章 Gin Web框架
- 动态 探索关于Golang的热门帖子
◇Revel
Revel 将端点组织到控制器中。它们提供了简单的数据绑定和表单验证。Revel使得Go模板在大规模使用时变得简单。注册功能以在操作之前或之后调用。
◇Echo
Echo 是一个注重性能、可扩展的开源Go Web应用程序框架。它是一个介于标准库+路由器和全栈Web框架之间的极简Web框架。
◇Gofiber
Go Fiber 是一个受Express启发的Golang框架。Go Fiber 是一个构建在快速HTTP之上的Web框架。它可以用于处理路由/端点、中间件、服务器请求等操作。
◇Gorilla
Gorilla 是一个用于Go编程语言的Web工具包,提供了有用的、可组合的包,用于编写基于HTTP的应用程序。
- 官方 Gorilla 工具包
- 开源 Gorilla
6. 日志记录
Go 内置了一些功能,使程序员更容易实现日志记录。第三方也构建了额外的工具来简化日志记录。
◇log/slog
log
和 log/slog
(自 Go 1.21 起)是 Go 中的标准日志记录包。这些包提供了一个简单的日志记录 API,可用于将消息记录到控制台或文件。
- 官方 文档:log
- 官方 文档:slog
- 官方 Go 博客:使用 slog 进行结构化日志记录
- 文章 Go 示例:日志记录
- 订阅 探索关于日志记录的顶级文章
◇Zap
在 Go 中实现极速、结构化、分级的日志记录。
- 开源 Zap
◇Zerolog
Zerolog 包提供了一个专用于 JSON 输出的快速且简单的日志记录器。
Zerolog 的 API 旨在提供出色的开发体验和惊人的性能。其独特的链式 API 允许 Zerolog 通过避免分配和反射来编写 JSON(或 CBOR)日志事件。
- 开源 Zerolog
7. 实时通信
顾名思义,实时通信是并发且高效地处理请求。无论是聊天/消息应用、电子邮件服务、游戏服务器还是任何在线协作项目(例如 Excalidraw),都有几种不同的处理实时通信的方式,但最常见的是通过使用 WebSockets。其他处理实时通信的选项包括 MQTT 协议和服务器发送事件等。
◇Melody
Melody 是一个基于 gorilla/websocket 的 WebSocket 框架,它抽象了处理 WebSocket 的繁琐部分。它让你可以专注于编写实时应用。
◇Centrifugo
Centrifugo 是一个开源的、可扩展的实时消息服务器。Centrifugo 可以立即将消息传递给通过支持的传输方式(WebSocket、HTTP-streaming、SSE/EventSource、GRPC、SockJS、WebTransport)连接的应用程序在线用户。Centrifugo 具有频道的概念,因此它是一个面向用户的 PUB/SUB 服务器。
- 官方 入门指南
- 开源 Centrifugo
8. API 客户端
API 客户端是一组在计算机应用程序上运行的工具和协议。它们帮助你在开发 Web 应用程序时绕过一些操作,而不是每次都重新发明轮子。使用客户端 API 是加快开发过程的好方法。
- 文章 API 客户端
- 订阅 探索关于 Golang 的顶级文章
◇REST
REST(Representational State Transfer)API(应用程序编程接口)用于在处理网站时提供用户功能。HTTP 请求用于与 REST API 通信,以便用户可以浏览 URL 网站。这些 URL 可以返回作为 API 一部分存储的某些信息。
- 官方 教程
- 视频 RESTful API 系列
- 订阅 探索关于 REST API 的顶级文章
Heimdall
Heimdall 是一个 HTTP 客户端,可帮助你的应用程序大规模地发出大量请求。使用 Heimdall,你可以:
-
使用类似 hystrix 的断路器来控制失败的请求
-
为每个请求添加同步的内存重试,并可以设置自己的重试策略
-
为每个请求创建具有不同超时的客户端 所有 HTTP 方法都作为流畅接口公开。
-
开源 Heimdall
Grequests
Golang 实现的 Python Grequests 库(Python 中著名的 HTTP 库之一)。
功能:
-
响应可以序列化为 JSON 和 XML
-
轻松上传文件
-
轻松下载文件
-
支持以下 HTTP 方法:GET、HEAD、POST、PUT、DELETE、PATCH、OPTIONS
-
开源 Grequests
◇GraphQL
GraphQL
是一种用于 API 的查询语言,它提供了一种服务,优先提供客户端请求的数据,而不是更多。此外,你不需要像 REST API 那样担心破坏性更改、版本控制和向后兼容性。因此,你可以通过使用 GraphQL
来实现你的版本并自动记录你的 API。
- 路线图 访问专用的 GraphQL 路线图
- 官方 学习 GraphQL
- 官方 GraphQL 教程
- 文章 Red Hat:什么是 GraphQL?
- 文章 Digital Ocean:GraphQL 简介
- 视频 GraphQL 完整课程——从新手到专家
- 视频 初学者 GraphQL 系列(由 Ben Awad 在 YouTube 上发布)
- 订阅 探索关于 GraphQL 的顶级文章
Graphql-go
一个用于 Go
的 GraphQL
包。
- 开源 Graphql
- 文章 Graphql-go 主页
- 文章 Graphql-go 文档
- 视频 GraphQL-Go - Golang 教程(由 TechPractice 在 YouTube 上发布)
- 订阅 探索关于 GraphQL 的顶级文章
Gqlgen
根据其文档,它是一个用于轻松构建 GraphQL 服务器的 Golang 库。
- 官方 Gqlgen 文档
- 文章 介绍 gqlgen:一个用于 Go 的 GraphQL 服务器生成器
- 视频 Go 中的 GraphQL - GQLGen 教程(由 acklackl 在 YouTube 上发布)
9. Go代码测试
Go内置了一个测试命令,我们可以用它来测试我们的程序。
- 官方 Go教程:添加测试
- 文章 Go示例:测试
- 文章 YourBasic Go:表驱动单元测试
- 文章 通过测试学习Go
- 订阅 探索关于测试的热门文章
10. 微服务工具
微服务是一种软件开发架构方法,允许通过可部署的服务创建分布式应用程序,这些服务通过定义良好的API进行通信。它是单体应用的一种解决方案。
- 官方 Chris Richardson的微服务模式和资源
- 文章 微服务简介
- 文章 微服务反模式和陷阱 - Mark Richards
- 文章 构建微服务,第二版 - Sam Newman
- 订阅 探索关于微服务的热门文章
◇Watermill
Watermill是一个用于处理Go中异步请求的事件流库。它为发布/订阅提供了多种实现。例如,您可以使用传统的发布/订阅系统,如Kafka或RabbitMQ,也可以使用HTTP或MySQL binlog,具体取决于您的用例。
- 官方 Watermill网站
- 官方 Watermill文档
◇Rpcx
Rpcx是一个类似于阿里巴巴Dubbo和微博Motan的RPC(远程过程调用)框架。使用Rpcx的一些优势包括:
-
简单:易于学习、开发、集成和部署
-
性能:高性能(>= grpc-go)
-
跨平台:支持原始字节切片、JSON、Protobuf和MessagePack。理论上它可以与Java、PHP、Python、C/C++、Node.js、C#等平台一起使用
-
服务发现和服务治理:支持Zookeeper、etcd和Consul
-
官方 Rpcx官方网站
-
官方 Rpcx文档
-
开源 Rpcx
◇Go-kit
Go kit是一个用于在Go中构建微服务(或优雅的单体应用)的编程工具包。它解决了分布式系统和应用架构中的常见问题,使您可以专注于交付业务价值。
- 官方 Go-kit网站
- 文章 使用Go kit构建Go中的微服务
- 视频 使用Go Kit工具包构建微服务
- 订阅 探索关于Golang的热门文章
◇Micro
Micro是一个API优先的开发平台。它利用微服务架构模式,并提供了一组作为平台构建块的服务。
◇go-zero
go-zero是一个内置了许多工程最佳实践的Web和RPC框架。它的诞生是为了确保繁忙服务的稳定性,具有弹性设计,并且已经为拥有数千万用户的站点服务多年。
- 官方 Go-zero
- 官方 Go-zero文档
- 开源 Go-Zero
- 订阅 探索关于Golang的热门文章
◇Protocol Buffers
Protocol Buffers(Protobuf)是一种免费、开源、语言中立、平台中立、可扩展的数据格式,用于序列化结构化数据。它类似于JSON,但更小更快,并且生成本地语言绑定。
使用Protocol Buffers的一些优势包括:
-
紧凑的数据存储
-
快速解析
-
多种编程语言支持
-
通过自动生成的类优化功能
-
开源 Protobuf
-
文章 Protobuf文档
◇gRPC-Go
gRPC的Go语言实现(gRPC是一种用于实现RPC API的技术)。
- 官方 Go中gRPC基础教程介绍
- 开源 gRPC-go
- 文章 gRPC-go文档
- 订阅 探索关于gRPC的热门文章
◇Grpc gateway
gRPC-Gateway在gRPC服务之上创建了一层,将充当客户端的RESTful服务。它是protoc的一个插件。它读取gRPC服务定义并生成一个反向代理服务器,将RESTful JSON API转换为gRPC。
- 官方 Grpc-gateway文档
- 开源 Grpc-gateway
- 订阅 探索关于gRPC的热门文章
◇Twirp
Twirp是一个用于服务间通信的框架,强调简单性和极简主义。它从API定义文件生成路由和序列化,并让您专注于应用程序的逻辑,而不必考虑HTTP方法、路径和JSON等繁琐问题。