这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
1 Go 语言简介
Go 语言(又称 Golang)起源于 2007 年,并在 2009 年正式对外发布。主要目标是“兼具 Python 等动态语言的开发速度和 C/C++ 等编译型语言的性能与安全性”。Go语言是编程语言设计的又一次尝试,是对类 C 语言的重大改进,它不但能让你访问底层操作系统,还提供了强大的网络编程和并发编程支持。有很多重要的开源项目都是使用 Go 语言开发的,例如 Docker。
Go 语言具有以下特点:
- 高性能、高并发
- 语法简单、学习曲线平滑
- 有丰富的标准库和完善的工具链
- 静态链接
- 快速编译
- 跨平台
- 垃圾回收
2 Go 开发环境配置
以下内容基于 Windows 平台
2.1 安装 Golang
到 go官网下载安装包并安装,完成后配置环境变量
2.2 IDE
常用的 IDE 是 Goland 和 VsCode + Go 插件。基于个人习惯我选择了后者。
在 VsCode 中,安装了 Go 插件后,用 VsCode 打开一个 Go 项目时,还是弹出提示框提示要安装一些相关插件,并且点击安装会安装失败(因为给的安装链接是外网)。这时我们需要配置下 Go 的代理。
打开 Windows Terminal,输入以下命令
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
完成后再重新安装上述插件。
命令行运行 Go 程序
使用 go run [filename].go 可以直接编译并运行 Go 程序。
使用 go build [filename].go 可以将 Go 代码编译为可执行的程序。
3 Go 基础语法
此部分建议参阅老师给的eaxample代码工程,过完example目录下的20个例子,对 Go 的基本语法应该就能有较好的掌握了。Go 的语法有很多高质量文章,此处我不再赘述。
我想补充的是一些老师后面3个实战案例中用到,但是基础语法部分没有提到的相关知识,方便大家更好去理解3个实战案例。
3.1 协程(Goroutine)
协程是 Go 语言中并发编程的关键。协程可以简单理解为轻量级的线程,这也是 Go 语言高性能的核心来源之一。
常用的使用方式是配合匿名函数使用:
go func(args) {
[function content]
} (real_args)
这段代码的意思是,开启一个协程,去执行该匿名函数。
以下是一个使用协程的例子。
示例:使用协程快速打印多次hello goroutine
package main
import (
"fmt"
"time"
)
func hello(i int) {
fmt.Println("hello goroutine: ", i)
}
func main() {
for i := 0; i < 5; i++ {
go func(j int) {
hello(j)
}(i)
}
time.Sleep(time.Second)
}
在 hello 函数中,我们打印一次 hello goroutine 以及输入的整数。
在 main 函数中,我们使用 for 循环开启 5 个协程,全都执行 hello 函数,并将循环的索引变量 i 输入进去。
结果如下:
hello goroutine: 4
hello goroutine: 0
hello goroutine: 1
hello goroutine: 2
hello goroutine: 3
可以发现数字并没有按顺序来,这表明每次hello函数的执行是并发进行的。
3.2 通道
通道是连接多个 Go 协程的管道,是实现协程间通信的主要机制。你可以从一个 Go 协程将值发送到通道,然后在别的 Go 协程中接收。
使用 c = make(chan [type])来创建一个type类型的通道,type类型也是协程间传递的消息的类型。c是所创建的通道变量
使用 -< 运算符来在通道上传递消息,方向是从右向左。
以下是一个例子:
package main
import "fmt"
func main() {
// messages 通道传递 string 类型的消息
messages := make(chan string)
// 在一个新的 Go 协程中发送 "ping" 到上面创建的 messages 通道中。
go func() { messages <- "ping" }()
// 从通道中接收一个值。这里将接收我们在上面发送的 "ping" 消息并打印出来。
msg := <-messages
fmt.Println(msg)
}
学了协程和通道以后再去看老师的第三个例子,你应该能更好地理解第三个实战案例。