Go语言上手-工程实践|青训营笔记

61 阅读3分钟
  1. 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文件管理依赖包版本 定义版本规则和项目管理关系

依赖管理三要素:

  1. go.mod 配置文件,描述依赖,包如何唯一的定位 2.Proxy 中心仓库管理依赖库 3.本地工具 go/get mod

想要每个项目都使用包,需要在每个package下都有mod。 依赖分发 GOPROXY

图片.png

测试 测试文件由test.go结尾 func TestXxx(*testing.T) Mock 用一个函数A替换函数B patch是一个打桩函数,target是目标函数,replacement Unpatch是卸载打桩函数 图片.png monky.patch monkey.Unpatch 图片.png 需要用到随机函数的性能问题的时候需要fastrand函数,实现了随机序列的一致性。

项目实践 1.需求设计 2.代码开发 3.设计运行 ER图 Topic(话题)和Post(帖子)的关系是一对多的关系 图片.png 做项目时可参考分层结构:数据层-逻辑层-视图层 图片.png 图片.png 数据层通过本地的操作来拉取帖子的话题和数据 Repository对Sevice层透明,会屏蔽下一层的数据差异。也就是说需求是file,但是数据可能在数据库里,也有可能在下一个微服务里,所以Repository可以对Sevice暴露的接口可以是不变的。 Sevice层不需要关心底层的数据存储,只需要拿到Repository时返回的一个Model数据就可以。Sevice层通过接受Repository的一些数据做封装,输出一个实体Entity(即话题页面),Controller层,视图层包装一些数据格式,json格式化一个结果做封装,通过api的方式进行访问。

组件工具

图片.png

第二个框之间的程序可以减少存储空间,有了后面的两个函数就可以传输到逻辑层 图片.png “code”=0表示成功

图片.png 话题信息和回帖信息都依赖于topicID,两个流程没有相互依赖,所以可以并行执行。 所以wg.Add(2)添加两个,括号中为2。在每个Repository中调用每个协程的方法,进行数据的查询。最后需要wg.wait()进行堵塞,来等待话题信息和回帖信息。 图片.png 1.通过遍历post和topic文件生成内存map索引 2.初始化引擎配置 3.构建路由 4.启动服务