Go语言基础 | 青训营笔记

569 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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)
}

学了协程和通道以后再去看老师的第三个例子,你应该能更好地理解第三个实战案例。