这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天
此笔记的主要内容如下
- 语言进阶:从并发编程的视角了解Go高性能的本质
- 依赖管理:了解Go语言依赖管理的演进路线
- 测试:从单元测试实践出发提升大家的质量意识
- 项目实战:通过项目需求、需求拆解、逻辑设计、代码实现感受真实的项目开发
并发 vs 并行
多线程程序在一个核的cpu上运行,这种同时运行状态的实现主要是通过时间片切换来达到的;并行是直接利用多核实现多线程的同时运行。
在实际应用场景中,并行是实现并发的一种手段
Go可以充分发挥多核优势,高效运行
Goroutine
协程:用户态,轻量级线程,栈MB级别 线程:内核态,线程跑多个协程,栈KB级别
例.快速打印hello (快速,所以需要多个协程)
func hello(i int) {
println("hello: " + fmt.Sprint(i))
}
func main() {
for i := 0; i < 5; i++ {
go func(j int) {
hello(j)
}(i)
}
time.Sleep(time.Second)
}
Communicating Sequential Processes
提倡通过通信共享内存而不是通过内存而实现通信
Channel
例.A子协程发送0-9数字,B子协程计算输入数字的平方,朱携程输出最后的平方数
func CalSquare() {
src := make(chan int)
dest := make(chan int, 3)
go func() {
defer close(src)
for i:=0; i < 10; i++ {
src ← i
}
}()
go func() {
defer close(dest)
for i := range src {
dest← i*i
}
}()
for i:=range dest {
println(i)
}
}
并发安全Lock
var (
x int64
lock sync.Mutex
)
func addWithLock() {
for i:=0; i < 2000; i++ {
lock.Lock()
x+=1
lock.Unlock()
}
}
func Add() {
x = 0;
for i:=0; i < 5; i++ {
go addWithLock()
}
time.Sleep(time.Second)
}
项目实战
社区话题页面
- 展示话题(标题,文字描述)和回帖列表
- 暂不考虑前端页面实现,仅仅实现一个本地web服务
- 话题和回帖数据用文件存储
分层结构
- 数据层:数据Model,外部数据的增删改查
- 逻辑层:业务Entity,出力核心业务逻辑输出
- 视图层:视图View,处理和外部的交互逻辑