Go工程进阶 | 青训营笔记

55 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天

课堂笔记

  • 本堂课的知识要点有哪些?

1.Goroutine

2.Channel

3.并发安全:锁

4.Go Module

5.gin框架

  • 本堂课介绍了哪些知识点?

(1)Goroutine

协程:用户态,轻量级线程,栈MB级别.

线程:内核态,线程跑多个协程,栈KB级别.

在Golang中,使用go关键字来开一个协程,例如下面的例子

func hello(i int) {
   fmt.Println(i)
}
func main() {
   for i := 0; i < 5; i++ {
      go func(j int) {
         hello(j)
      }(i)
   }
   time.Sleep(time.Second)
}

输出结果是

2
1
3
4
0

Go提倡通过通信共享内存而非通过内存实现通信

后者会导致race问题,造成资源浪费

(二)Channel

初始化无缓冲通道和有缓冲通道

hello1 := make(chan string)
hello2 := make(chan string,2)

无缓冲通道hello1又称为同步通道,是即时的资源交换,若放值和取值的时刻不是同时进行会被阻塞,在生产者的效率方面这并不好

而有缓冲通道hello2可以临时储存,可以不同时进行放值和取值

(三)并发安全

使用sync库的

var Lock sync.Mutex
Lock.Lock()//加锁
Lock.Unlock()//解锁

在一个协程操作资源时会加锁,导致其他协程必须等待unlock才能继续操作资源,防止race问题

优雅的阻塞---WaitGroup

var wg sync.WaitGroup
wg.Add(5)
wg.Done(1)
wg.Wait()

wg.Add(5):增加5个任务点

wg.Done(1):减去一个任务点

wg.Wait():阻塞 等到任务点全部完成

(四)依赖

1.GOPATH

bin:项目编译的二进制文件

pkg:项目编译的中间产物,加速编译

src:项目源码

弊端:无法实现多版本的控制

2.Go Module

go.mod :配置文本描述依赖

Proxy :中心仓库管理依赖库

go get/mod :本地工具

go mod init//初始化go.mod
go mod download//下载模块到缓存
go mod tidy//增加需要的依赖,删除不需要的依赖
  • 有什么实践举例帮助理解知识点?

1.开启五个goroutine每个协程是让i++,初始i为0

不在对i加锁的步骤上下加锁结果值可能小于10000

而对i加锁

lock.Lock()
i++
lock.Unlock()

结果就一定是10000

2.gin框架

web框架 - Gin

分层结构设计

文件操作 - 读文件

数据查询 - 索引

在Router接口层

r:=gin.Default()
r.GET(...)
r.Run()

快速起一个http服务

  • 本章有什么知识点不容易掌握?

Goroutine,Channel作为Go语言的一大特色,其高并发和带来的安全问题是一大难点,而且锁也有读写锁,互斥锁等等,熟悉通道的使用以及其在不同协程之间的资源交换是不容易掌握的,需要非常多的开发经验和理论基础...

gin框架中的上下文和一些方法需要重点使用和理解,如ShouldBind,Set等等,需要不断开发积累起来经验才可以学懂,同时还要具备一定量的计算机网络知识