本系列文章作者twowinter,转载请注明作者:http://blog.csdn.net/iotisan/
对于 go 的入门学习,我比较推荐两本书:《Go程序设计语言》by Alan.A.A.Donowan、《go语言编程》by 许世伟 吕桂华。《Go程序设计语言》是谷歌工程师出品,详细描述了 Go 语言设计的一些思路;《go语言编程》是国内第一本Go语言书籍,书中参考了《Go程序设计语言》的章节排布,同时增加了一些更通俗的讲解。
这两本书章节排布让我对go语言有了清晰的体会,因此我把它也呈现到我的系列笔记中,同时增加了一些扩展,形成了一个较为完整的知识体系:
第二部分到第五部分,是go语言核心部分,介绍了顺序编程,面向对象编程,并发编程三大块内容。
第六部分到第八部分,是对 go 标准库及社区公共库 的应用,借助这些弹药,帮助我们快速开发包括网络在内的各类应用。
1.1 Go开发环境搭建
一个编译器安装包、一个环境变量设置,便完成了开发环境的安装。早期学习只针对 window,建议大家直接上官网。
1.2 将 VS CODE 打造成 go 开发利器
2019 年了,现在 VS CODE 已经成为 golang 最好用的编辑器。通过插件实现诸如代码关联跳转等特性。
2.1 第1个程序 helloworld
万事开头难,在 C:\Go\test 目录下,有一堆官方提供的示例。找到大部分教程都推荐的第1个程序,helloworld.go。运行试试效果。
2.2 这儿有包了解一下
包是Go语言中结构化代码的方式,每个程序都由包组成,可以使用自身的包或者从其它包中导入内容。同其它编程语言中的类库或命名空间的概念。这篇笔记学习了包的基础知识,包名、包的导入、包的可见性规则,通过一个实例来加深了知识点印象。
3.3.3 单引号、双引号和反引号
反引号在某些需要展示字符串字面量的场合还是很有用,比如我们要展示一个多行的函数。
OOP 的编程思想,主导位置,几乎所有广泛应用的语言都支持这种思想。
4.1 方法
4.2 接口
接口是Go语言整个类型系统的基石。它是使用方法的抽象,使当前程序可以更聚焦在方法的应用,不关心该方法的具体实现。就像是先设置了一个岗位,描述了岗位的职责,一些规章可以先根据岗位职责来制定;当应用程序开始执行的时候,需要给接口传入一个实例,相当于企业开始运营时再把一个人放到这个岗位。
各类基础架构软件渐渐使用 go 语言,go 越来越多被用在了 server 端。
5.1 协程 goroutine
goroutine 应该是 Go 语言最显著的特点,从它占用 go 关键字就可以看出来。只要在函数前加go关键字就可以优雅地实现并发,非常符合人类串行思维。
5.2 channel
Go语言 channel 优雅地实现了协程间的消息通信,一旦满了就阻塞写入,一旦空了就阻塞读取。
5.3 上下文 context
GO 内置的 Context 包可以在不同的 Goroutine 之间同步请求数据,还能优雅地通过 WithTimeout 设置超时及 WithCancel 设置取消信号来结束上下文。
从这一部分开始,我们脱离GO语言核心,开始学习 GO 的标准库和社区库,各种轮子。
我们把最重度使用的网络编程单独一章来写。除了语言核心支持并发外,go 提供了很多轮子使得网络编程变得格外轻松。
6.1 HTTP 编程
6.1.1 HTTP 客户端
Go语言标准库提供的 HTTP 客户端相当优雅,一方面可以极其简单的使用 Get、Post 方法,另一方面又具备极大的灵活性(可以详细设置业务层和传输层的细节)。
6.2 JSON 处理
encoding/json 标准库除了使用 Marshal()、Unmarshal() 进行 json 编解码之外,还支持使用 Decoder 和 Encoder 进行流式读写。
6.3 RPC 编程之 gRPC
本篇笔记演示了如何使用 gRPC 框架,包括 proto 文件定义服务,使用 pb 编译器产生代码,最后使用 gRPC API 编写 client 和 server 代码。
6.3.1 gRPC 使用 metadata 自定义认证
gRPC 可用 metadata 自定义认证信息。客户端使用 WithPerRPCCredentials 方法,服务端使用 metadata.FromIncomingContext 方法从 RPC 消息的上下文中获取 metadata。
6.3.2 gRPC 认证
6.4 JSON Web Tokens (JWT)
本篇笔记介绍 JWT 库的 DEMO 应用,还实现了一个比较常用的 gRPC JWT 认证的示例。具体使用方法:在 jwt 生成时使用 jwt.NewWithClaims 方法,需传入 header claim实例 和 密钥;在 jwt 解析时使用 jwt.ParseWithClaims 方法,需传入 claim 结构体 和 密钥,可返回解析是否正确,及 token 是否有效。
6.4 Socket 编程
不管是标准库,还是社区开源库,都是很好的轮子。以往在C语言领域,一般都是各家自己储备自己的弹药库,而 go 则希望借助社区的力量,让每个人都拥有这样的弹药库。
除了上面网络编程的轮子,还有其他常见的轮子值得学习。
格式化IO
在格式化 IO 时,%v,打印变量的具体数值,这是万能打印,会根据变量的类型做调整。%T,打印变量的类型。
日志库 logrus
Logrus 最大的特色是结构化日志记录,可以携带field;另外结合 hook 可以实现非常灵活的日志分发和内容调整。
[文件操作]
https://www.cnblogs.com/flash55/p/11110008.html
系统信号 os signal
时间处理 time
命令行处理 cobra
配置管理 viper
DB连接库 mysql
DB连接库 redigo
工具 uuid
uuid 包支持 5 种 uuid 的生成及解析,最广泛使用的就是生成一个V4版本的 uuid:u1 = uuid.Must(uuid.NewV4())
测试框架 goconvey
go trace