这是我参与「第三届青训营 -后端场」笔记创作活动的的第6篇笔记
大项目总结
历时一个多月(其实真正静心去写了也没有这么久哈哈哈哈哈)终于完成了本次青训营的大项目--抖音项目。这也是我第一次使用go语言搭建后台还是遇到了很多的问题的。
小聪明篇
go语言优异的goroutine
go语言创建一个goroutine实在是太方便了,于是我很自然想到了可以使用并发查询的方式提高数据库的查询效率。
在项目中,遇到了一个接口需要返回视频流,这个视频流包含这视频的信息和作者的信息。如果像往常一样,我们可能会选择使用一个复杂的多表查询,但是无可厚非多表查询会占用更多的运行时间,也会存在查询语句极为复杂的诟病。于是想到将其分成多个查询语句,首先对单表查询返回这个视频流中所有的视频信息,接着创建多个goroutine分别查询每个视频的信息,可以大大加快查询效率。
另外值得注意的是,在使用goroutine的时候,要注意将循环语句中的变量拿出来,避免数据竞争。
for index, indexVideo := range videos {
//多线程查询video的信息们
indexVideo := indexVideo
//此处需要对indexVideo进行阴影处理,否则会产生一个数据竞争
go func(video *repository.Video, userId int64, index int) {
defer waitGroup.Done()
author, err1 := videoListDao.AuthorInformation(video.AuthorId, userId)
...
...
}
我造的bug们
时间
以后再涉及到时间查询问题我会更加仔细辨别是使用时间戳还是使用格式化时间,前者面临多方传参时间戳精度不同,精度不同会导致比较结果不一样,但是时间戳跨时区还是比较好的。格式化的时间在不同精度的比较上可能比较好一些,但是要仔细坚持时区问题。
命名
命名时一定要仔细考虑,特别是数据库字段命名,在这次命名时便发生了几处不太友好的地方,真的编程的时候把大家都绕的晕晕的。后患无穷啊!
规范
因为第一个写go的大项目,对语言规范非常欠缺,导致了最后写的代码真的很恶心哈哈哈哈,一定要了解编码规范,对人对己都好!
总结:
说到底做到了go语言几乎从0到开发,也算是一个突破!以后要仔细研究go的基础语法和设计模式了。