这是我参与「第五届青训营 」笔记创作活动的第1天。
一、本堂课重点内容:
从并发编程的视角解读Go语言的高性能特性;学习Go语言的依赖管理;学会单元测试;通过项目需求、需求拆解、逻辑设计、代码实现来实现真实的项目开发。
二、详细知识点介绍:
(1)从并发编程的视角解读Go语言的高性能特性
Go可以充分发挥多核优势,高效运行。当CPU为单核时,多线程程序只能依次执行,相当于串行执行,需要等待实践较久,但是当CPU为多核时,多线程程序可以同时运行,实现并行执行,提高程序运行的速度。
Channel分为无缓冲通道和有缓冲通道,其中无缓冲通道属于同步传输,容易阻塞,而有缓冲通道属于异步传输,不容易阻塞。
Sync包下的一些关键字,其中lock可以实现并发安全,waitGroup实现计数器的作用。**
(2)Go语言的依赖管理
Go 依赖管理的演进过程为:GOPATH->Go Vendor->Go Module,不同的环境依赖不同的版本。
GOPATH 无法实现package的多版本控制;Go Vendor 通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题,但无法控制依赖的版本;Go Module 定义了版本的规则和管理项目的依赖关系。
依赖管理的三要素为:配置文件,中心仓库管理依赖库,本地工具。
(3)学会单元测试
单元测试是避免事故的最后一道屏障,另外可以在较短时间内定位和修复问题。
代码覆盖率可以用来衡量代码是否经过了足够的测试,评价项目的测试水准,评价项目是否达到了高水准测试等级。
Mock测试对函数(方法)打桩测试,不再依赖本地文件。
内置的测试框架提供了基准测试的能力。
(4)项目开发实战
项目开发可以以分为三个步骤:需求设计,代码开发,测试运行。
后端开发主要分为三层:数据层(dto),逻辑层(service),视图层(controller)。
数据层主要负责外部数据的增删改查,业务逻辑层主要负责处理核心业务逻辑输出,视图层主要负责处理和外部的交互逻辑。
三、实践练习例子:
(1)快速打印 hello goroutine
package main
import (
"fmt"
"time"
)
func hello(i int) {
fmt.Println("hello goroutine :" + fmt.Sprint(i))
}
func HelloGoRoutine() {
for i := 0; i < 5; i++ {
go func(j int) {
hello(j)
}(i)
}
time.Sleep(time.Second)
}
func main() {
HelloGoRoutine()
}
(2)Channel测试
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 {
src <- i * i
}
}()
for i := range dest {
fmt.Println(i)
}
}
func main() {
CalSquare()
}
四、课后个人总结:
项目开发的过程中,首先要确定好数据模型,建立对应的数据库,根据数据模型实例依次写service层的逻辑。Sql中构建索引很重要,通过索引可以在较大数据量的数据库中可以快速定位到目标数据。