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

 原站地址: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.mzph.cn/web/6875.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

交互中的“互”难以产生的原因

脑机交互技术的目标是通过分析和解读大脑活动,将其与特定的意图、指令或行为连接起来。通过训练和分析,可以建立起大脑活动与特定行为或意图之间的关联模型,从而实现脑机交互的应用,例如控制外部设备、传递信息等。然而&#xff0…

Python机器学习实验 Python 数据可视化

1.实验目的 掌握 Matplotlib 数据可视化的常用方法。 2.实验内容 1. 绘制鸢尾花数据集的特征分布图 说明:鸢尾花是单子叶百合目花卉,是一种比较常见的花,鸢尾花的品种较多。 鸢尾花数据集最初由 Edgar Anderson 测量得到,而后在…

android中给view添加遮罩层

1.在 res 目录中添加 id : <?xml version"1.0" encoding"utf-8"?> <resources><item name"view_mask_id" type"id" /> </resources> 2.扩展方法: /** 给一个 View 添加一层由 [res] 填充的遮罩层布局, 可…

深入学习和理解Django模板层:构建动态页面

title: 深入学习和理解Django模板层&#xff1a;构建动态页面 date: 2024/5/5 20:53:51 updated: 2024/5/5 20:53:51 categories: 后端开发 tags: Django模板表单处理静态文件国际化性能优化安全防护部署实践 第一章&#xff1a;模板语法基础 Django模板语法介绍 Django模…

每天五分钟深度学习:数学中常见函数中的导数

本文重点 导数是微积分学中的一个核心概念,它描述了函数在某一点附近的变化率。在物理学、工程学、经济学等众多领域中,导数都发挥着极其重要的作用。本文旨在详细介绍数学中常见函数的导数,以期为读者提供一个全面而深入的理解。 数学中常见的导数 常数函数的导数 对于常数…

ctfshow 框架复现

文章目录 web 466web 467web 468web469web 470web 471web 472web 473web 474web 475web 476 web 466 Laravel5.4版本 &#xff0c;提交数据需要base64编码 代码审计学习—Laravel5.4 - 先知社区 (aliyun.com) 用第二条链子 反序列化格式 /admin/序列化串base64<?php na…

大模型在自动驾驶领域的应用

大模型在自动驾驶领域的应用主要体现在以下几个方面&#xff1a; 1. **感知与识别**&#xff1a;自动驾驶车辆需要准确地感知周围环境&#xff0c;包括其他车辆、行人、交通标志等。大型深度学习模型&#xff0c;如卷积神经网络&#xff08;CNN&#xff09;和递归神经网络&…

(论文阅读-多目标优化器)Multi-Objective Parametric Query Optimization

目录 摘要 一、简介 1.1 State-of-the-Art 1.2 贡献和大纲 二、定义 三、相关工作 四、问题分析 4.1 分析 4.2 算法设计影响 五、通用算法 5.1 算法概述 5.2 完备性证明 六、分段线性代价函数算法 6.1 数据结构 6.2 基本运算实现 6.3 复杂度分析 七、实验评估 …

FR-TSN4206获得“时间敏感网络产业链名录计划”测试认证证书,TSN交换机助力智能工业发展

TSN技术&#xff0c;即时间敏感网络技术&#xff0c;已成为智能工业、自动驾驶等领域的核心。它通过时钟同步、数据调度等功能&#xff0c;确保低延迟、高可靠性的数据传输。 为推动TSN技术在我国的发展&#xff0c;工业互联网产业联盟联合多家单位启动了“时间敏感网络产业链名…

Amazon EKS创建EFS存储卷

1、创建Amazon EFS CSI 驱动程序 亚马逊相关文档 在 Select trusted entity&#xff08;选择受信任的实体&#xff09;页面上操作 在 Add permissions&#xff08;添加权限&#xff09;页面上筛选AmazonEFSCSIDriverPolicy操作 记得将AmazonEBSVolumePolicy添加到我们创建的…

Colab/PyTorch - Getting Started with PyTorch

Colab/PyTorch - Getting Started with PyTorch 1. 源由2. 概要2.1 PyTorch是什么&#xff1f;2.2 为什么学习PyTorch&#xff1f;2.3 PyTorch库概览 3. 步骤4. 预期&展望5. 总结6. 参考资料 1. 源由 世界在发展&#xff0c;为其服务的技术也在不断演变。每个人都要跟上技…

Docker-Compose 容器集群的快速编排

Docker-compose 简介 Docker-Compose项目是Docker官方的开源项目&#xff0c;负责实现对Docker容器集群的快速编排。 Docker-Compose将所管理的容器分为三层&#xff0c;分别是 工程&#xff08;project&#xff09;&#xff0c;服务&#xff08;service&#xff09;以及容器&…

2024阿里云ctf-web-chain17学习

agent jdk17依赖有h2思路清晰打jdbc attack <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/com.aliba…

AI图书推荐:ChatGPT在真实商业世界中的应用

《ChatGPT在真实商业世界中的应用》 (Unleashing The Power of ChatGPT: A Real World Business Applications)首先概述了ChatGPT及其在对话式人工智能领域的影响。接着&#xff0c;你将深入了解ChatGPT的技术方面&#xff0c;理解机器学习算法和自然语言处理如何在后台工作。然…

Raft共识算法笔记,MIT6.824,

处理leader和follow的一个重要思路是多数投票&#xff0c;确保系统中存在奇数个服务器&#xff08;例如3台&#xff09;。进行任何操作都需要来自多数服务器的同意&#xff0c;例如3台服务器中的2台。如果没有多数同意&#xff0c;系统会等待。为什么多数投票有助于避免脑裂问题…

【Linux】目录和文件相关的命令,补充:centos7系统目录结构

【Linux】Linux操作系统的设计理念之一就是“一切皆文件”&#xff08;Everything is a file&#xff09;&#xff0c;即将设备、文件等都当作“文件”处理。 “文件”主要类型有&#xff1a;目录&#xff08;即文件夹&#xff09;&#xff0c;链接文档&#xff08;即快捷方式…

【论文复现】Graph Attention Networks图注意力神经网络

图注意力神经网络 前言一、论文解读1.1 模型架构1.2 数学推导 二、代码复现2.1 数据准备2.1.1 数据转化2.1.2 创建数据集 2.2 模型构建2.2.1 参数设置2.2.2 模型代码2.2.3 pytorch官方GAT源码实现 2.3 模型训练 三、结果展示3.1 复现结果3.2 论文结果 四、代码细节代码链接 前言…

【Python项目】基于opencv的的【疲劳检测系统】

技术简介&#xff1a;使用Python技术、OpenCV图像处理库、MYSQL数据库等实现。 系统简介&#xff1a;用户可以通过登录系统平台实现实时的人脸照片的拍摄和上传&#xff0c;结合上传图像的内容进行后台的图像预处理和运算分析&#xff0c;用户可以通过照片分析界面查看到当前检…

数学中的极值

在数学领域中&#xff0c;极值是一个重要的概念&#xff0c;它不仅在纯数学理论研究中占据核心地位&#xff0c;还在实际应用中发挥着巨大作用。从微积分的基本定理到优化问题的求解&#xff0c;从物理学的能量守恒到经济学的边际分析&#xff0c;极值理论无处不在。本文将详细…

【MySQL】第一次作业

【MySQL】第一次作业 1、在官网下载安装包2、解压安装包&#xff0c;创建一个dev_soft文件夹&#xff0c;解压到里面。3、创建一个数据库db_classes4、创建一行表db_hero5、将四大名著中的常见人物插入这个英雄表 写一篇博客&#xff0c;在window系统安装MySQL将本机的MySQL一定…