- go并发模型 并发VS并行 多线程程序在一个核的cpu上运行 多线程程序在过个GPU上运行
协程:用户态 创建停止都属于很重的系统操作,很消耗内存 线程:内核态 线程可以去跑多个协程 go语言开启协程的时候可以在func前面加上一个go 例: go func(j int){ hello(j) } time.Sleep(time.Second)是为了保证协程在运行的时候不退出。
协程之间的通信 1.通过通信共享内存 2.通过共享内存实现通信
CSP go提倡使用通信共享内存而不是通过共享内存而实现通信 Channel 分为有缓冲通道和无缓冲通道 无缓冲也成为同步通道 可以使用带有缓冲区的有缓冲通道
2.依赖管理 (1)GoPATH bin 项目编译的二进制文件 pkg 项目编译的中间产物 src 项目源码 通过go get下载最新版本的包到src目录下
弊端:如果项目AB依赖于某一package的不同版本,则无法实现多版本控制
(2)Go Vender 存储项目的依赖包副本解决这个问题 vender-》go PATH
(3) go Moudle 通过go.mod文件管理依赖包版本 定义版本规则和项目管理关系
依赖管理三要素:
- go.mod 配置文件,描述依赖,包如何唯一的定位 2.Proxy 中心仓库管理依赖库 3.本地工具 go/get mod
想要每个项目都使用包,需要在每个package下都有mod。 依赖分发 GOPROXY
测试
测试文件由test.go结尾
func TestXxx(*testing.T)
Mock
用一个函数A替换函数B
patch是一个打桩函数,target是目标函数,replacement
Unpatch是卸载打桩函数
monky.patch
monkey.Unpatch
需要用到随机函数的性能问题的时候需要fastrand函数,实现了随机序列的一致性。
项目实践
1.需求设计 2.代码开发 3.设计运行
ER图 Topic(话题)和Post(帖子)的关系是一对多的关系
做项目时可参考分层结构:数据层-逻辑层-视图层
数据层通过本地的操作来拉取帖子的话题和数据
Repository对Sevice层透明,会屏蔽下一层的数据差异。也就是说需求是file,但是数据可能在数据库里,也有可能在下一个微服务里,所以Repository可以对Sevice暴露的接口可以是不变的。
Sevice层不需要关心底层的数据存储,只需要拿到Repository时返回的一个Model数据就可以。Sevice层通过接受Repository的一些数据做封装,输出一个实体Entity(即话题页面),Controller层,视图层包装一些数据格式,json格式化一个结果做封装,通过api的方式进行访问。
组件工具
第二个框之间的程序可以减少存储空间,有了后面的两个函数就可以传输到逻辑层
“code”=0表示成功
话题信息和回帖信息都依赖于topicID,两个流程没有相互依赖,所以可以并行执行。
所以wg.Add(2)添加两个,括号中为2。在每个Repository中调用每个协程的方法,进行数据的查询。最后需要wg.wait()进行堵塞,来等待话题信息和回帖信息。
1.通过遍历post和topic文件生成内存map索引
2.初始化引擎配置
3.构建路由
4.启动服务