GO语言核心30讲 实战与应用 (第一部分)

devtools/2024/12/22 9:25:06/

 原站地址:Go语言核心36讲_Golang_Go语言-极客时间

一、测试的基本规则和流程

1.  GO程序主要分三类测试:功能测试、性能测试,以及示例测试。

     示例测试和功能测试差不多,但它更关注程序打印出来的内容。

2. 测试文件的名称应该以被测源码文件的名称为前导,并以“_test”为后缀。

    例如,如果被测文件的名称为 demo52.go,那么测试文件的名称就是 demo52_test.go。

3. 对测试函数的名称和签名都有哪些规定? 

功能测试: 函数名称以Test为前缀,参数列表中有一个*testing.T类型的参数。

能能测试: 函数名称以Benchmark为前缀,参数列表中有一个*testing.B类型的参数。

示例测试: 函数名称以Example为前缀,对参数列表没有强制规定。

4. go test命令执行的测试流程是怎样?

(1) 检查内部命令、源码文件有效性,标记是否合法。

(2) 对每个被测代码包,依次地进行构建。

(3) 执行符合要求的测试函数。

(4) 清理临时文件,打印测试结果

5. 功能测试下,多个代码包是并发进行的。

    性能测试下,多个代码包是串行进行的。

6. 性能测试,是在所有构建步骤都做完之后,go test命令才会真正地开始进行。多个文件,多个函数,都是串行地逐个执行。目的是保证独立执行,性能测试准确。

7. 测试结果包含三部分:运行情况,测试文件路径,耗时

$ go test puzzlers/article20/q2
ok   puzzlers/article20/q2 0.008s

8. 代码没有变动情况下,go test命令 会执行把之前缓存的结果 打印出来,时间变成 "cached"。不会重复执行。

   go clean -cache 命令可以手动删除缓存数据。

  设置值gocacheverify=1 将会导致 go 命令绕过任何的缓存数据。

9. 如果测试失败了:

(1) go test命令并不会进行缓存

(2) 测试日志会被打印出来  (t.Log,t.Error)

10.  t.Fatal 和t.Fatalf ,作用是打印失败错误日志之后,立即终止测试函数并宣告测试失败

11. 解释输入性能测试命令,比如:go test -bench=. -run=^$ puzzlers/article20/q3 

      -bench:标明是执行性能测试。 -bench=.:带上 =. 表示 执行所有名称的性能测试函数

      -run:标明是执行功能测试。-run=^$:带上=^$ 表示执行所有名称为空的功能测试函数,也就是 不执行功能测试函数。  不输入这个的话,默认是会执行的,但性能测试下我们需要不执行。

12. 性能测试的结果,包含了什么数据?

$ go test -bench=. -run=^$ puzzlers/article20/q3
goos: darwin
goarch: amd64
pkg: puzzlers/article20/q3
BenchmarkGetPrimes-8      500000       2314 ns/op
PASS
ok   puzzlers/article20/q3 1.192s

    主要是在其中一句:BenchmarkGetPrimes-8      500000       2314 ns/op

    BenchmarkGetPrimes-8:执行了性能测试函数GetPrimes, 同时运行 goroutine 的逻辑 CPU 数量是 8

   500000: 函数运行时间不超过上限(默认1秒)的条件下,能执行多少次。

   2314 ns/op: 单次执行GetPrimes函数的平均耗时。

二、更多的测试手法

1. go test -cpu P : 设置测试使用多少个CPU

     P 代表着 Go 运行时系统同时运行 goroutine 的数目,也可以视为逻辑 CPU 的最大个数.

2. go test -parallel x : 设置功能测试函数的最大并发执行数。默认值是上面的P。

    这个命令只用于功能测试,对性能测试无效。

3. 性能测试中,可以通过 b.StartTimer和b.StopTimer 的联合运用,去除掉部分代码的执行时间。

    也可以用b.ResetTimer 去除在调用它之前那些代码的执行时间。

三、sync.Mutex与sync.RWMutex

1. 同步的用途: 避免多个线程同时操作一个数据块 或 一个代码块

   数据块和代码块合称 共享资源

2. 一个代码片段需要实现对共享资源的串行化访问(独占),就可以被视为一个临界区

    这样的代码片段有多个,就被称为相关临界区。

3.  Go 中,可选择的同步工具不少。其中最重要且最常用的,当属 互斥锁sync.Mutex

     互斥锁要求每当 goroutine 想进入临界区时,都需要对mutex进行锁定 mu.Lock();

     goroutine 离开临界区时,都要对mutex进行解锁 mu.Unlock()。

4. 对一个已经被锁定的互斥锁进行锁定,会立即阻塞当前的 goroutine。(互斥锁能够保护临界区的原因)

5. Go 语言系统只要发现所有的goroutine 都处于阻塞状态,就会触发 panic。

   Go 语言系统自行抛出的 panic 属于致命错误,是无法被recover函数恢复的。也就是说,一旦产生死锁,程序必然崩溃。

6. 使用互斥锁的注意事项:

(1) 不要重复锁定

(2) 不要忘记解锁,必要时使用defer语句

(3) 不要重复解锁,不要对尚未锁定的互斥锁进行解锁(会panic)

(4) 不要在多个函数之间传递互斥锁

7. 读写锁sync.RWMutex)包含了两个锁,即:读锁和写锁。

    Lock方法和Unlock方法对写锁进行锁定和解锁,

    RLock方法和RUnlock方法对读锁进行锁定和解锁。

8. 读写锁sync.RWMutex)规则:

(1) 在写锁已被锁定的情况下,再锁定写锁,会阻塞当前的 goroutine。

(2) 在写锁已被锁定的情况下,锁定读锁,也会阻塞当前的 goroutine。

(3) 在读锁已被锁定的情况下,锁定写锁,同样会阻塞当前的 goroutine。

(4) 在读锁已被锁定的情况下,试图锁定读锁,并不会阻塞当前的 goroutine。

   也就是,读锁是写锁的一部分,只要和写锁有关,就变成只有一个锁。 

9. 解锁一个写锁,会唤醒试图锁定读锁所有goroutine。

    解锁一个读锁,只会唤醒试图锁定写锁一个goroutine。唤醒哪个,取决于等待时间。


http://www.ppmy.cn/devtools/34473.html

相关文章

Phi-2:小型语言模型令人惊人的能力

导语 phi-系列模型是微软研究团队推出的轻量级人工智能模型,旨在实现“小而精”的目标,能够实现在低功耗设备上例如智能手机和平板电脑上部署运行。截止目前,已经发布到了phi-3模型,本系列博客将沿着最初的phi-1到phi-1.5&#x…

基于LLama3、Langchain,Chroma 构建RAG

概要: 使用Llama3 Langchain和ChromaDB创建一个检索增强生成(RAG)系统。这将允许我们询问有关我们的文档(未包含在训练数据中)的问题,而无需对大型语言模型(LLM)进行微调。在使用RA…

Unity DOTS1.0(8) Aspect核心机制分析

Aspect 概念: ASPECT是一种用于描述Entity的特性或特征的概念。ASPECT通常用于在系统中筛选出具有特定组件集合的实体。 你可以把5~6个组件得引用保存到一个数据对象里面(Aspect),你通过Aspect就可以拿到这些组件得引用,从而访问这些组件数据; Unity 会…

读天才与算法:人脑与AI的数学思维笔记19_深度数学

1. 深度数学 1.1. 组合与选择,是发明新事物的两个不可或缺的条件 1.1.1. 保尔瓦雷里(Paul Valry) 1.2. 利用以往的数学定理证明过程训练算法,以发现新的定理 1.3. 谷歌设在伦敦的总部整体有一种现代牛津大学的感觉&#xff0c…

Cocos Creator UICanvas详解与2D游戏配置详解

前言 Cocos Creator是一款强大的2D游戏开发引擎,提供了丰富的工具和组件来帮助开发者快速制作出优秀的游戏作品。其中,UICanvas是Cocos Creator中一个非常重要的组件,用于管理游戏中的UI界面。 在本文中,我们将深入探讨Cocos Cr…

虚幻引擎5 Gameplay框架(二)

Gameplay重要类及重要功能使用方法(一) 配置LOG类及PlayerController的网络机制 探索验证GamePlay重要函数、类的执行顺序与含义 我们定义自己的日志,专门建立一个存放自己日志的类,这个类继承自BlueprintFunctionLibrary 然后…

uniapp 应用闪退、崩溃异常日志捕获插件(可对接网络上报)插件 Ba-Crash

应用闪退、崩溃异常日志捕获插件(可对接网络上报) Ba-Crash 简介(下载地址) Ba-Crash 是一款uniapp应用闪退、崩溃异常日志捕获插件,支持对接网络上报、设置提示等等,方便对一些远程问题、原生问题进行分…

“Postman 中文版使用教程:如何切换到中文界面?”

Postman 的很好用的接口测试软件。但是,Postman 默认是英文版的,也不支持在软件内切换为中文版。很多同学的英语并不是很好,看到一堆的英文很是头痛。 今天我们来介绍下:切换到 Postman 中文版的方法。想要学习更多的关于 Postma…