Go工程进阶 | 青训营笔记

67 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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.项目实战

主要了解了项目开发流程、结构以及熟悉并发,依赖,测试等具体用法

比较通用的一种分层结构

数据层,逻辑层,视图层

数据层:处理数据,封装外部数据的增删改查

逻辑层:处理核心业务逻辑输出

视图层:处理和外部交互的逻辑