了解方向
- 一些核心概念:并发或其他(以及实现逻辑)
- Go语言特性:
- 打包/环境/开发依赖工具(获取和构建代码)
- Go语言内置类型:数组/切片/映射
- 内置类型系统:结构体类型,具名类型,接口,类型嵌套
- 调度器/并发/通道如何工作
- 常用的并发模式,goroutine池的实现,如何复用资源
- 标准库的使用:log,json,io
- 测试/基准测试
细节特性
为并发而生
- 并发更好的使用多核心CPU
- 并发基于GoRoutine,类似于线程,但并非线程,可以理解成一种虚拟线程
- go运行时会调度gourouring,并将goroutine合理分配到每一个CPU中,最大限度使用CPU
- goroutine之间使用通道channel通信
package main
import (
"fmt"
"math/rand"
"sync"
"time"
)
const (
numberGoroutines = 4 //要使用的goroutine数量
taskLoad = 20 //要处理的工作数量
)
var wg sync.WaitGroup
//init 初始化包 在运行其他代码之前执行
func init(){
rand.Seed(time.Now().Unix())
}
//入口函数
func main(){
//创建一个有缓冲的通道来管理工作
tasks :=make(chan string,taskLoad)
//启动GoRoutine来处理工作
wg.Add(numberGoroutines)
for gr :=1;gr<=numberGoroutines ;gr++ {
go worker(tasks,gr)
}
//增加一组要完成的工作
for post :=10; post<taskLoad;post++ {
tasks <- fmt.Sprintf("Task: %d\n",post)
}
//完成之后关闭GoRoutine
close(tasks)
//等待所有工作完成
wg.Wait()
}
//工作函数
func worker(tasks chan string,worker int){
//通知函数已返回
defer wg.Done()
for{
task,ok := <-tasks;
if !ok {
//表示通道已经空了,并且被关闭了
fmt.Printf("Worker:%d: Shutting Down \n ",worker)
return
}
fmt.Printf("Worker:%d: Started %s\n",worker,task)
//随机等待一段时间 再来工作
sleep := rand.Int63n(100)
time.Sleep(time.Duration(sleep)*time.Millisecond)
fmt.Printf("Worker:%d:Completed %s\n",worker,task)
}
}
- 输出
H-----E-----L-----L-----O-----
aaaa:0
aaaa:1
aaaa:2
aaaa:3
aaaa:4
aaaa:5
aaaa:6
aaaa:7
aaaa:8
aaaa:9赋值后:100 --- 200Multiply 2 * 5 * 6 = 60
Process finished with exit code 0
. . .