这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
1.并发
(1)协程(goroutine)
概念:Go语言中的goroutine就是这样一种机制,goroutine的概念类似于线程,但 goroutine是由Go的运行时(runtime)调度和管理的
协程是用户态,轻量级线程,栈kb级别。线程是内核态,线程跑多个协程,栈mb级别。
使用:启动goroutine的方式非常简单,只需要在调用的函数(普通函数和匿名函数)前面加上一个go关键字。
func hello() {
fmt.Println("Hello Goroutine!")
}
func main() {
hello()
fmt.Println("main goroutine done!")
}
(2)通道(channel)
概念:Go 语言中的通道(channel)是一种特殊的类型。通道像一个传送带或者队列,总是遵循先入先出(First In First Out)的规则,保证收发数据的顺序。每一个通道都是一个具体类型的导管,也就是声明channel的时候需要为其指定元素类型。
无缓冲的通道
func main() {
ch := make(chan int)
ch <- 10
fmt.Println("发送成功")
}
有缓冲的通道
func main() {
ch := make(chan int, 1) // 创建一个容量为1的有缓冲区通道
ch <- 10
fmt.Println("发送成功")
}
2.依赖管理
(1)gopath
由bin,pkg,src三部分组成的环境变量
其中 bin:项目编译的二进制文件
pkg:编译中间产物,能加速编译
src:项目源代码
弊端:无法实现多版本控制
(2)go vender
增加了vender文件,通过引入副本,解决了多个项目需要同一个package依赖的问题
弊端:更新项目时可能会编译错误,也无法控制依赖版本
(3)go mod
在1.16版本以后默认开启
能通过go.mod文件管理依赖的版本
也能通过go get/mod 指令管理依赖包
3.单元测试
(1)作用
单元测试是整个软件开发过程中的一个重要环节 ,执行一个完备的单元测试方案能够提高整个开发过程的时间效率,确保软件的实际功能与详细设计说明的一致性,使软件开发的效率和软件产品的质量得到最好的保障 。
(2)规范
1、文件名必须以xx_test.go命名 2、方法必须是Test开头 3、方法参数必须 t *testing.T 4、使用go test执行单元测试
(3)例子
import(
"github.com/stretchr/testify/assert"
"testing"
)
func TestHelloTom(t *testing.T) {
output := HelloTom()
expectOutput := "Tom"
assert.Equal(t, expectOutput, output)
}
func HelloTom() string {
return "Tom"
}
(4)代码覆盖率
测试覆盖率是你的代码被测试套件覆盖的百分比。通常我们使用的都是语句的覆盖率,也就是在测试中至少被运行一次的代码占总代码的比例。
Go提供内置功能来检查你的代码覆盖率。我们可以使用go test -cover来查看测试覆盖率。
也是衡量测试质量好坏的准则
4.项目实战
主要了解了项目开发流程、结构以及熟悉并发,依赖,测试等具体用法
比较通用的一种分层结构
数据层,逻辑层,视图层
数据层:处理数据,封装外部数据的增删改查
逻辑层:处理核心业务逻辑输出
视图层:处理和外部交互的逻辑