当前位置: 首页 > 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;数据库的增删改查…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...