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

慕课网Go-4.package、单元测试、并发编程

package

在这里插入图片描述

1_1_User.go

package usertype User struct {Name string
}

1_1_UserGet.go

package userfunc GetCourse(c User) string {return c.Name
}

1_1_UserMain.go

package mainimport ("fmt"Userch03 "goproj/IMOOC/ch03/user"//别名,防止同名歧义
)func main() {c := Userch03.User{Name: "hi,user",}fmt.Println(Userch03.GetCourse(c))
}

gin

github链接

package mainimport ("net/http""github.com/gin-gonic/gin"
)func main() {r := gin.Default()r.GET("/ping", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "pong",})})r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

首次使用时,包的导入报错:
鼠标放在"github.com/gin-gonic/gin",出现提示框,点击Sycn…,等一会报错消失
Sync过程自动下载,可以在go.mod中看到

在这里插入图片描述

或者在终端打开、go mod tidy

在这里插入图片描述

单元测试

package mainfunc add(a, b int) int {return a + b
}
package mainimport "testing"func TestAdd(t *testing.T) {if testing.Short(){t.Skip("short模式")}re := add(1, 2)if re != 3 {t.Errorf("expect:%d,actual:%d", 3, re)}
}

终端go test
在这里插入图片描述
测试函数前的运行箭头右键后
在这里插入图片描述

在这里插入图片描述

基于表格

func TestAdd2(t *testing.T) {var dataset = []struct {a   intb   intout int}{{1, 1, 2},{-9, 8, 1},{0, 0, 0},}for _, value := range dataset {re := add(value.a, value.b)if re != value.out {t.Errorf("expect:%d,actual:%d", 3, re)}}
}

性能测试

const numbers = 10000func BenchmarkStringSprintf(b *testing.B) {b.ResetTimer()for i := 0; i < b.N; i++ {var str stringfor j := 0; j < numbers; j++ {str = fmt.Sprintf("%s%d", str, j)}}b.StopTimer()
}func BenchmarkStringAdd(b *testing.B) {b.ResetTimer()for i := 0; i < b.N; i++ {var str stringfor j := 0; j < numbers; j++ {str += strconv.Itoa(j)}}b.StopTimer()
}func BenchmarkStringBuilder(b *testing.B) {b.ResetTimer()for i := 0; i < b.N; i++ {var builder strings.Builderfor j := 0; j < numbers; j++ {builder.WriteString(strconv.Itoa(j))}_ = builder.String()}b.StopTimer()
}

并发编程

package mainimport ("fmt""time"
)func asyncPrint() {time.Sleep(time.Second)fmt.Println("hi")
}func main() {go asyncPrint()fmt.Println("main")time.Sleep(2 * time.Second)fmt.Println("main2")
}
import "fmt"func main() {fmt.Println("method1")for i := 0; i < 100; i++ {go func() {fmt.Println(i)}()}//fmt.Println("method2")//for i := 0; i < 100; i++ {//	tmp := i//	go func() {//		fmt.Println(tmp)//	}()//}//fmt.Println("method3")//for i := 0; i < 100; i++ {//	go func(i int) {//		fmt.Println(i)//	}(i)//}
}

waitgroup

package mainimport ("fmt""sync"
)func main() {var wg sync.WaitGroupwg.Add(100)fmt.Println("method3")for i := 0; i < 100; i++ {go func(i int) {defer wg.Done()fmt.Println(i)}(i)}wg.Wait()
}

互斥锁mutex

package mainimport ("fmt""sync""sync/atomic"
)var total int32
var wg sync.WaitGroup
var lock sync.Mutexfunc add() {defer wg.Done()for i := 0; i < 10000; i++ {atomic.AddInt32(&total, 1)//lock.Lock()//total += 1//lock.Unlock()}
}func sub() {defer wg.Done()for i := 0; i < 10000; i++ {atomic.AddInt32(&total, -1)//lock.Lock()//total -= 1//lock.Unlock()}
}func main() {wg.Add(2)go add()go sub()wg.Wait()fmt.Println(total)fmt.Println("all done")
}

读写锁rwlock

package mainimport ("fmt""sync""time"
)func main() {var rwlock sync.RWMutexvar wg sync.WaitGroupwg.Add(6)//写锁go func() {time.Sleep(3 * time.Second)rwlock.Lock()defer rwlock.Unlock()fmt.Println("writing")time.Sleep(5 * time.Second)fmt.Println("write finish")}()time.Sleep(time.Second)//读锁for i := 0; i < 5; i++ {go func() {defer wg.Done()for j := 0; j < 10; j++ {rwlock.RLock()time.Sleep(500 * time.Millisecond)fmt.Println("read")rwlock.RUnlock()}}()}wg.Wait()
}

channel

package mainimport "fmt"func main() {//有缓存var msg1 chan stringmsg1 = make(chan string, 1) //1是缓存空间大小msg1 <- "harry"data := <-msg1fmt.Println(data)//无缓存,happen-before机制var msg2 chan stringmsg2 = make(chan string, 0)go func(msg2 chan string) {data2 := <-msg2fmt.Println(data2)}(msg2)msg2 <- "potter"var msg3 chan intmsg3 = make(chan int, 2)go func(msg3 chan int) {for data3 := range msg3 {fmt.Println(data3)}fmt.Println("all done")}(msg3)msg3 <- 1msg3 <- 2close(msg3)var ch1 chan int   //双向var ch2 chan<- int //只写入var ch3 <-chan int //只读取c := make(chan int, 3)var send chan<- int = cvar receive <-chan int = c
}

打印数字和字母

package mainimport ("fmt""time"
)var number, letter = make(chan bool), make(chan bool)func printNum() {i := 1for {<-numberfmt.Printf("%d%d", i, i+1)i += 2letter <- true}`在这里插入代码片`
}func printLetter() {i := 0str := "ABCDEFGHIJKLMNOPQRSTUVWXYZ"for {<-letterif i >= len(str) {return}fmt.Print(str[i : i+2])i += 2number <- true}
}func main() {go printNum()go printLetter()number <- truetime.Sleep(100 * time.Second)
}

select

package mainimport ("fmt""time"
)// 空结构体不占内存、channel多线程安全
var done = make(chan struct{})func g1(ch1 chan struct{}) {time.Sleep(time.Second)ch1 <- struct{}{}
}func g2(ch2 chan struct{}) {time.Sleep(1 * time.Second)ch2 <- struct{}{}
}func main() {ch1 := make(chan struct{})ch2 := make(chan struct{})go g1(ch1)go g2(ch2)//执行先就绪的channel,都就绪则随机(防止饥饿)//select {//case <-ch1://	fmt.Println("g1 done")//case <-ch2://	fmt.Println("g2 done")//default://	fmt.Println("default")//}timer := time.NewTimer(5 * time.Second)select {case <-ch1:fmt.Println("g1 done")case <-ch2:fmt.Println("g2 done")case <-timer.C:fmt.Println("time our")return}
}

context

package mainimport ("fmt""sync""time"
)var wgc sync.WaitGroupfunc cpuInfo(stop chan struct{}) {defer wgc.Done()for {select {case <-stop:fmt.Println("退出CPU监控")returndefault:time.Sleep(2 * time.Second)fmt.Println("CPU信息")}}
}func main() {var stop = make(chan struct{})wgc.Add(1)go cpuInfo(stop)time.Sleep(6 * time.Second)stop <- struct{}{}wgc.Wait()fmt.Println("监控完成")
}
package mainimport ("context""fmt""sync""time"
)var wgc2 sync.WaitGroupfunc cpuInfo2(ctx context.Context) {defer wgc2.Done()for {select {case <-ctx.Done():fmt.Println("退出CPU监控")returndefault:time.Sleep(2 * time.Second)fmt.Println("CPU信息")}}
}func main() {wgc2.Add(1)ctx, cancel := context.WithCancel(context.Background())go cpuInfo2(ctx)time.Sleep(6 * time.Second)cancel()wgc2.Wait()fmt.Println("监控完成")
}

相关文章:

慕课网Go-4.package、单元测试、并发编程

package 1_1_User.go package usertype User struct {Name string }1_1_UserGet.go package userfunc GetCourse(c User) string {return c.Name }1_1_UserMain.go package mainimport ("fmt"Userch03 "goproj/IMOOC/ch03/user"//别名&#xff0c;防止同名…...

[JavaWeb]SQL介绍-DDL-DML

SQL介绍-DDL-DML 一.SQL简介1.简介2.SQL通用语法3.SQL语言的分类 二.DDL-操作数据库与表1.DDL操作数据库2.DDL操作表①.查询表(Retrieve)②.创建表(Create)③.修改表(Update)④.删除表(Delete) 三.Navicat的安装与使用四.DML-操作表数据1.添加(Insert)2.修改(Update)3.删除(Del…...

git源码安装(无sudo权限)

git源码安装&#xff08;无sudo权限&#xff09; 下载源码解压安装添加到环境变量 下载源码 去https://mirrors.edge.kernel.org/pub/software/scm/git/下载需要的版本。我下载的是2.41.0版本 wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.41.0.tar.gz解…...

Web3 叙述交易所授权置换概念 编写transferFrom与approve函数

前文 Web3带着大家根据ERC-20文档编写自己的第一个代币solidity智能合约 中 我们通过ERC-20一种开发者设计的不成文规定 也将我们的代币开发的很像个样子了 我们打开 ERC-20文档 我们transfer后面的函数就是transferFrom 这个也是 一个账号 from 发送给另一个账号 to 数量 val…...

Redis系列二:Clion+MAC+Redis环境搭建

1. ClionMACRedis-3.0-annotated环境搭建 参考&#xff1a; https://github.com/huangz1990/redis-3.0-annotated https://gitee.com/dumpcao/redis-3.0-annotated-cmake-in-clion https://tool.4xseo.com/a/12910.html 1.1 下载并导入Clion git clone https://gitee.com/dum…...

Linux下 Docker容器引擎基础(2)

目录 创建私有仓库 将修改过的nginx镜像做标记封装&#xff0c;准备上传到私有仓库 将镜像上传到私有仓库 从私有仓库中下载镜像到本地 CPU使用率 CPU共享比例 CPU周期限制 CPU 配额控制参数的混合案例 内存限制 Block IO 的限制 限制bps 和iops 创建私有仓库 仓库&a…...

现场服务管理系统有哪些?5个现场服务管理软件对比

现场售后服务管理软件的使用者通常是机械设备、家电、仪表仪器、医疗器械等厂商的工程师和客服调度人员。现场售后服务管理软件可将服务过程标准化&#xff0c;包括工单派发、服务过程步骤、配件订购出货和付款、客户评价都有系统支持&#xff0c;有的现场售后服务软件还支持数…...

leetcode 912.排序数组

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;排序数组 思路&#xff1a; 此题如果使用冒泡插入选择这些时间复杂度 O ( N 2 ) O(N^2) O(N2) 的算法会超时&#xff0c;使用快排 优化也过不去&#xff0c;因为里面有一个测试用例全是 2 即使加了三数取中也会是 O (…...

利用MMPreTrain微调图像分类模型

前言 MMPreTrain是一款基于PyTorch的开源深度学习预工具箱&#xff0c;是OpenMMLab项目的成员之一MMPreTrain的主要特性有&#xff1a; 支持多元化的主干网络与预训练模型支持多种训练策略&#xff08;有监督学习&#xff0c;无监督学习&#xff0c;多模态学习等&#xff09;提…...

express学习笔记3 - 三大件

便于统一管理router&#xff0c;创建 router 文件夹&#xff0c;创建 router/index.js&#xff1a; const express require(express)// 注册路由 const router express.Router() router.get(/,function(req,res){res.send(让我们开始express之旅) }) /*** 集中处理404请求的…...

Java课题笔记~Maven基础

2、Maven 基础 2.1 Maven安装与配置 下载安装 配置&#xff1a;修改安装目录/conf/settings.xml 本地仓库&#xff1a;存放的是下载的jar包 中央仓库&#xff1a;要从哪个网站去下载jar包 - 阿里云的仓库 2.2 创建Maven项目...

三步问题(力扣)n种解法 JAVA

目录 题目&#xff1a;1、dfs:2、dfs 备忘录&#xff08;剪枝&#xff09;&#xff1a;&#xff08;1&#xff09;神器 HashMap 备忘录&#xff1a;&#xff08;2&#xff09;数组 memo 备忘录&#xff1a; 3、动态规划&#xff1a;4、利用 static 的储存功能&#xff1a;&…...

flask---》登录认证装饰器/配置文件/路由系统

登录认证装饰器 # 0 装饰器的本质原理-# 类装饰器&#xff1a;1 装饰类的装饰器 2 类作为装饰器 # 1 装饰器使用位置&#xff0c;顺序 # 3 flask路由下加装饰器&#xff0c;一定要加endpoint-如果不指定endpoint&#xff0c;反向解析的名字都是函数名&#xff0c;不加装饰器…...

Jvm实际运行情况-JVM(十七)

上篇文章说jmap和jstat的命令&#xff0c;如何查看youngGc和FullGc耗时和次数。 Jmap-JVM&#xff08;十六&#xff09; Jvm实际运行情况 背景&#xff1a; 机器配置&#xff1a;2核4G JVM内存大小&#xff1a;2G 系统运行天数&#xff1a;7天 期间发生FULL GC次数和耗时…...

【BASH】回顾与知识点梳理(二)

【BASH】回顾与知识点梳理 二 二. Shell 的变量功能2.1 什么是变量&#xff1f;2.2 变量的取用与设定: echo, 变量设定规则: set/unset2.3 环境变量的功能用 set 观察所有变量 (含环境变量与自定义变量)export&#xff1a; 自定义变量转成环境变量那如何将环境变量转成自定义变…...

【分布式训练】Accelerate 多卡训练,单卡评测,进程卡住的解决办法

最近想把之前的一个模型的改成多卡训练的。我并不懂DDP&#xff0c;DP。一开始打算使用Transformers的Trainer&#xff0c;但是配置的过程踩了很多坑也没有弄成功。【我是自己写的评测方法&#xff0c;但是我找不到能让触发Trainer去用我的方法评测的路劲】&#xff0c;后来偶然…...

时间复杂度为O(nlogn)的两种排序算法

1.归并排序 归并排序的核心思想&#xff1a;如果要排序一个数组&#xff0c;我们先把数组从中间分成前后两部分&#xff0c;然后对前后两部分分别排序&#xff0c;再将排好序的两部分合并在一起&#xff0c;这样整个数组就都有序了。 归并排序使用的就是分治思想。分治&#x…...

java调用onnx模型,支持yolov5和yolov7

不点star不给解答问题 可直接运行主文件&#xff1a;ObjectDetection_1_25200_n.java 或者 ObjectDetection_n_7.java 都可以直接运行两个可以运行的主文件是为了支持不用网络结构的模型&#xff0c;即使是onnx模型&#xff0c;输出的结果参数也不一样&#xff0c;支持以下两种…...

DP-GAN损失

在前面我们看了生成器和判别器的组成。 生成器损失公式&#xff1a; 首先将fake image 和真实的 image输入到判别器中&#xff1a; 接着看第一个损失&#xff1a;参数分别为fake image经过判别器的输出mask&#xff0c;和真实的label进行损失计算。对应于&#xff1a; 其中l…...

自监督去噪:Noise2Void原理和调用(Tensorflow)

文章原文: https://arxiv.org/abs/1811.10980 N2V源代码: https://github.com/juglab/n2v 参考博客&#xff1a; https://zhuanlan.zhihu.com/p/445840211https://zhuanlan.zhihu.com/p/133961768https://zhuanlan.zhihu.com/p/563746026 文章目录 1. 方法原理1.1 Noise2Noise回…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

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

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

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

嵌入式常见 CPU 架构

架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集&#xff0c;单周期执行&#xff1b;低功耗、CIP 独立外设&#xff1b;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel&#xff08;原始…...

用鸿蒙HarmonyOS5实现国际象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的国际象棋小游戏的完整实现代码&#xff0c;使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├── …...