Go语言进阶 1.16 | 青训营笔记

29 阅读1分钟

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

今天的课程主要讲了四个方面的内容,Go的并发编程,Go的依赖管理,Go的测试,以及项目实战。同样我只挑自己感兴趣的方向进行记录。

并发编程

这里有一道比较有意思并发编程题,可以算对课上学习的一个回顾。

多线程交叉打印

题目描述:简单来说就是在go的两个协程中交叉打印同一个数组中的内容。

思路:使用两个channel,协程1的chan1收到通知后打印一次并给协程2的chan2发送通知,协程2同理。

这里chan1和chan2初始化的类型为chan struct{},因为这里仅做通知用,struct{}不占用内存。

同时使用了协程、channel以及sync.WaitGroup。

package main

import (
	"fmt"
	"sync"
)

func main() {
	ch1 := make(chan struct{}, 1)
	ch2 := make(chan struct{}, 1)
	str := []string{"a", "b", "c", "d", "e", "f", "g"}
	len := len(str)
	wg := sync.WaitGroup{}
	wg.Add(2)

	go func() {
		for i := 0; i < len; i += 2 {
			<-ch1
			fmt.Print(str[i])
			ch2 <- struct{}{}
		}
		wg.Done()
	}()

	go func() {
		for i := 1; i < len; i += 2 {
			<-ch2
			fmt.Print(str[i])
			ch1 <- struct{}{}
		}
		wg.Done()
	}()

	ch1 <- struct{}{}
	wg.Wait()
}

依赖管理

go的依赖管理主要经过了gopath、go vendor以及go mod阶段,这里相对还是比较熟悉,不做过多记录。

依赖管理三要素:

  1. 配置文件,描述依赖。
  2. 中心仓库管理依赖库。
  3. 本地工具。

测试

后续做实际项目时再补充。