当前位置: 首页 > news >正文

Go 语言进阶与依赖管理 | 青训营

Powered by:NEFU AB-IN

文章目录

  • Go 语言进阶与依赖管理 | 青训营
    • 语言进阶
    • 依赖管理
    • 测试

Go 语言进阶与依赖管理 | 青训营

  • GO语言工程实践课后作业:实现思路、代码以及路径记录

语言进阶

Go可以充分发挥多核优势,高效运行

Goroutine是Go语言中的协程,一种轻量级的线程,由Go语言的运行时管理,可以实现高并发的程序设计,由于轻量级的特性,goroutine可以创建成千上万个,而且消耗的资源也相对较少。

image.png

image.png

在函数前加入go关键字,为一个函数创建协程运行

package mainimport ("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) // 向函数传入i参数,作为j的值}time.Sleep(time.Second)
}func main() {HelloGoRoutine()
}/** hello goroutine : 4* hello goroutine : 2* hello goroutine : 1* hello goroutine : 3* hello goroutine : 0*/

运行结果是乱序的表示是并行运行的


CSP(Communicating Sequential Processes)通信顺序进程,是Go语言中重要的并发模型。

主要特征有

  1. 顺序进程:每个进程内部按顺序执行。
  2. 通信进程:进程间通过通信(Message Passing)来协作。
  3. 数据流:程序通过在进程间传递数据来工作。

Go语言的CSP实现主要通过goroutine和channel

  • goroutine作为顺序执行的进程
  • channel用于goroutine间的通信

image.png

无缓冲通道(同步通道)

image.png

image.png

在Go语言中,通过通信来共享内存是一种并发编程的思想,即通过goroutine之间的通信来进行数据共享,而不是直接共享内存空间。

具体来说,当多个goroutine需要共享数据时,传统的做法是使用共享内存的方式,即使用互斥锁等机制来控制对共享变量的访问。但在Go语言中,引入了一种更优雅的方式,即使用通道(channel)来实现数据共享。

package mainimport "fmt"func CalSquare() {src := make(chan int)     //   生产无缓冲dest := make(chan int, 3) //   消费缓冲3个元素// 子协程发送0-9数字go func() {defer close(src)for i := 0; i < 10; i++ {src <- i}}()// 子协程计算输入数字的平方go func() {defer close(dest)for i := range src {dest <- i * i}}()// 主协程输出最后的平方数for i := range dest {// 复杂操作// ...fmt.Println(i)}}func main() {CalSquare()
}

sync.WaitGroup是Go语言中的一个常用同步工具,可以用于等待一组goroutine结束。
内部维护了一个计数器,暴露add done wait三个方法

image.png

之前例子的优化

/** @Author: NEFU AB-IN* @Date: 2023-08-24 15:15:22* @FilePath: \GoTest\11\11.go* @LastEditTime: 2023-08-24 15:17:01*/
package mainimport ("fmt""sync"
)func hello(i int) {fmt.Println("hello goroutine : " + fmt.Sprint(i))
}func HelloGoRoutine() {var wg sync.WaitGroupwg.Add(5)for i := 0; i < 5; i++ {go func(j int) {defer wg.Done()hello(j)}(i)}wg.Wait()
}func main() {HelloGoRoutine()
}/** hello goroutine : 4* hello goroutine : 2* hello goroutine : 1* hello goroutine : 3* hello goroutine : 0*/

依赖管理

原生SDK(Software Development Kit)是指为特定操作系统或平台开发应用程序的软件工具包。它包含了一系列的开发工具和文档,用于帮助开发人员创建、测试和部署应用程序。原生SDK通常由操作系统或平台的开发者提供,可以让开发者利用操作系统或平台的特定功能和特性,开发高性能、可靠的应用程序。

image.png

go path

弊端:无法实现package多版本控制
image.png

go vendor

弊端:依赖关系隐藏在vendor中,理解和维护都更困难。依赖关系隐藏在vendor中,理解和维护都更困难。

image.png

go moudle
(类似于Java里的maven)

image.png

image.png

${major}.${minor}.${patch}

major为大版本,patch为bug修复版本,如v1.3.0

image.png


依赖图

保证v1.3和v1.4是兼容的
image.png


依赖分发 - go proxy

其实是个服务站点(中心仓库管理依赖库),缓存仓库和版本,直接从proxy拉取依赖

image.png

GOPROXY 是用逗号分隔的URL列表

image.png

go get

  • 下载包的源码
  • 解压到GOPATH下
  • 解析并下载依赖
  • 缓存各版本的依赖
  • 会更新go.mod文件

go mod

  • init
  • download
  • tidy

测试

image.png

单元测试

image.png

image.png

比如

func Add(a int, b int) int{return a+b
}func TestAdd(t *testing.T) {output:=Add(1, 2)expectOutput:=3if output != expectOutput{t.Error("Add failed")}
}

运行go test xxx.go 即可

image.png

assert

Go语言内置的testing包提供了assert包来进行单元测试的断言,assert能大大简化测试代码,不需要过多的if条件判断,只要最终结果不符合断言,就会自动标记为测试失败。

package Testimport ("github.com/stretchr/testify/assert""testing"
)func Add(a int, b int) int {return a + b
}func TestAdd(t *testing.T) {output := Add(1, 2)expectOutput := 3assert.Equal(t, expectOutput, output)
}

覆盖率

  • 当一个程序有多个分支时,就会产生多种测试案例,如果所有的测试案例都符合结果,那覆盖率就是100%。
  • 运行 go test xxx.go --cover,可以查看测试的覆盖率。
  • 一般覆盖率在50%~60%,较高覆盖率在80%+
  • 测试分支相互独立,全面覆盖

image.png

Mock测试

如果有一些外部依赖,可以通过mock实现
mock函数是用来模拟或替代指定函数的行为,以便在测试中控制函数的返回值或行为。

打桩是指在测试过程中为函数设置预期的返回值或行为,以确保测试代码的可重复性和可控性。通常使用mock函数来进行打桩操作,通过设置mock函数的返回值或行为,模拟特定情况下函数的行为,以便进行测试或验证。

基准测试

分析系统性能时,在本地会比较方便

基准测试是一种评估计算机系统、硬件或软件性能的方法。它通过运行一系列标准化的测试程序,以衡量系统在特定负载条件下的表现,从而提供了系统性能的参考标准或基准值。基准测试可以用于比较不同硬件或软件配置之间的性能差异,优化系统性能,或者评估系统变化对性能的影响。
基准测试通常涉及多个方面的测试,包括计算能力、内存管理、磁盘或存储访问、网络吞吐量等,并通过测量和记录相关性能指标,如处理速度、响应时间、吞吐量等来评估系统的性能。基准测试可以在实验室环境中进行,也可在真实场景中进行。
基准测试的结果可以用于为购买决策提供参考,评估系统在实际使用中的适应性,或者用于系统优化和调整,以达到更好的性能和效率。基准测试在计算机硬件和软件开发、系统管理和性能优化等领域都有广泛的应用。


相关文章:

Go 语言进阶与依赖管理 | 青训营

Powered by:NEFU AB-IN 文章目录 Go 语言进阶与依赖管理 | 青训营 语言进阶依赖管理测试 Go 语言进阶与依赖管理 | 青训营 GO语言工程实践课后作业&#xff1a;实现思路、代码以及路径记录 语言进阶 Go可以充分发挥多核优势&#xff0c;高效运行 Goroutine是Go语言中的协程…...

hyperf 十三 视图

教程&#xff1a;Hyperf composer地址&#xff1a;hyperf/view - Packagist 本次测试使用twig twig composedr地址&#xff1a;twig/twig - Packagist twig 文档地址&#xff1a;Home - Twig - The flexible, fast, and secure PHP template engine 一、安装 composer re…...

请你说说前端图形图像的框架

前端图形图像方面有许多强大的框架和库&#xff0c;使得开发者能够更容易地创建丰富的视觉效果和复杂的图形应用。下面列举了一些主要的框架和库&#xff1a; 1. Three.js Three.js 是一款运行在浏览器中的 3D 引擎&#xff0c;你可以用它创建各种三维场景&#xff0c;包括了…...

C++数据结构学习——栈

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、栈二、C语言实现1.声明代码2.实现增删查改代码3.测试代码 总结 前言 栈&#xff08;Stack&#xff09;是计算机科学中一种常见的数据结构&#xff0c;它是…...

【C++笔记】C++之类与对象(下)

【C笔记】C之类与对象(下&#xff09; 1、再看构造函数1.1、构造函数的初始化列表1.2、C支持单参数的构造函数的隐式类型转换1.3、匿名对象 2、Static成员2.1、为什么要有静态成员变量&#xff1f;2.2、一个类的静态成员变量属于这个类的所有对象2.3、静态成员函数 3、友元3.1、…...

管理类联考——英语——实战篇——大作文——图表——动态图表——整体效果

动态图表模板 What is clearly presented in the above 图表类型 is that dramatic changes have taken place in 主题词1 from 年份1 to 年份2.During the period, there was a marked jump from 数字1 to 数字2 in 事物1,while that of 事物2 declined significantly from 数…...

threejs纹理加载三(视频加载)

threejs中除了能把图片作为纹理进行几何体贴图以外&#xff0c;还可以把视频作为纹理进行贴图设置。纹理的类型有很多&#xff0c;我们可以用不同的加载器来加载&#xff0c;而对于视频作为纹理&#xff0c;我们需要用到今天的主角&#xff1a;VideoTexture。我们先看效果&…...

VUE笔记(三)vue的语法

一、计算属性 1、计算属性的概念 计算属性是依赖于源数据(data或者属性中的数据)&#xff0c;在元数据的基础上进行逻辑运算后得到的新的数据&#xff0c;计算属性要依赖于源数据&#xff0c;源数据数据变化计算属性也会变化 2、计算属性的语法 在vue2中使用computed这个选…...

探讨uniapp的路由与页面生命周期问题

1 首先我们引入页面路由 2 页面生命周期函数 onLoad() {console.log(页面加载)},onShow() {console.log(页面显示)},onReady(){console.log(页面初次显示)},onHide() {console.log(页面隐藏)},onUnload() {console.log(页面卸载)},onBackPress(){console.log(页面返回)}3 页面…...

咸鱼之王俱乐部网站开发

我的俱乐部 最新兑换码 *注意区分大小写&#xff0c;中间不能有空格&#xff01; APP666 HAPPY666 QQ888 QQXY888 vip666 VIP666 XY888 app666 bdvip666 douyin666 douyin777 douyin888 happy666 huhushengwei888 taptap666 周活动 宝箱周 宝箱说明 1.木质宝箱开启1个…...

Electron+Vue3+TS 打包exe客户端

Electron Vue3 TS 实战 - 掘金 如果报错loaderContext.getOptions is not a function ts-loader版本不一致导致的问题。 解决方案&#xff1a;npm install ts-loader8.0.0 --save...

vue3范围选择组件封装

个人项目地址&#xff1a; SubTopH前端开发个人站 &#xff08;自己开发的前端功能和UI组件&#xff0c;一些有趣的小功能&#xff0c;感兴趣的伙伴可以访问&#xff0c;欢迎提出更好的想法&#xff0c;私信沟通&#xff0c;网站属于静态页面&#xff09; SubTopH前端开发个人站…...

能被整除的数(容斥原理)

思路&#xff1a; &#xff08;1&#xff09;需求&#xff1a;求对于1~n中至少能被p1~pm至少1个整除的数的个数&#xff0c;由于都是质数&#xff0c;彼此互质&#xff0c;不需要进行质因子分解&#xff0c;根据容斥原理&#xff0c; res n/p1 n/p2 ... n/pm - n /(p1p2) -…...

Modbus转Profinet网关与流量变送器兼容转ModbusTCP协议博图配置

首先&#xff0c;我们需要明确电磁流量计的通信协议是Modbus&#xff0c;而西门子1200PLC的通信协议是Profinet。这两种协议在功能和特性上存在一定的差异&#xff0c;因此需要使用兴达易控Modbus转Profinet网关设备进行转换。兴达易控的XD-MDPN100是Profinet转ModbusTCP的网关…...

HLS实现CORDIC算法计算正余弦并上板验证

硬件&#xff1a;ZYNQ7010 软件&#xff1a;MATLAB 2019b、Vivado 2017.4、HLS 2017.4、System Generator 2017.4 1、CORDIC算法计算正余弦 CORDIC算法详细分析网上有很多资料&#xff0c;它的原理是用一系列旋转去逼近目标角度&#xff0c;这一系列旋转的角度为 θ a r c t…...

高阶数据结构并查集

目录&#xff1a; 并查集的概念代码实现 LeetCode例题 并查集的概念 将n个不同的元素划分成一些不相交的集合。开始时&#xff0c;每个元素自成一个单元元素集合&#xff0c;然后按一定的规律将归于同一组元素的集合合并。在此过程中反复遇到查询某一个元素属于那个集合的运算…...

WSL2连接不了外网怎么办?

某天忽然WLAN变成地球图标&#xff0c;上不了Internet&#xff0c;搞了半天网络适配器&#xff0c;仍然不行。回忆之前做过的操作&#xff0c;曾经运行过ZoogVPN&#xff0c;试着启动并连接&#xff0c;然后退出&#xff0c;WLAN神奇地恢复了连接&#xff0c;可以上Internet了。…...

【C/C++】探索内存对齐的奥秘与优势

目录 一&#xff0c;前言 二&#xff0c;什么是内存对齐&#xff1f; 三&#xff0c;内存对齐的原理 四&#xff0c;内存对齐的优势 五&#xff0c;如何实现内存对齐&#xff1f;&#xff08;看这节就行&#xff09; 1.使用 #pragma pack 来实现内存对齐的示例 七&#…...

leetcode分类刷题:滑动窗口(二、重复元素类型)

1、连续子数组、连续子串问题通常需要滑动窗口来求解&#xff0c;本篇文章对应的“二、重复元素类型”在此基础上对连续子数组、连续子串中重复元素个数、种类进行考察&#xff0c;此时&#xff0c;需要使用和维护哈希表进行左右指针的移动&#xff0c;因此这类题目对应的解法为…...

MySQL—buffer pool

一、buffer pool的介绍 Buffer pool是什么 一个内存区域&#xff0c;为了提⾼数据库的性能&#xff0c;数据库操作数据的时候&#xff0c;把硬盘上的数据加载到buffer pool&#xff0c;不直接和硬盘打交道&#xff0c;操作的是 buffer pool的数据&#xff0c;数据库的增删改查…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...