慕课网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"//别名,防止同名…...

[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源码安装(无sudo权限) 下载源码解压安装添加到环境变量 下载源码 去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环境搭建 参考: 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镜像做标记封装,准备上传到私有仓库 将镜像上传到私有仓库 从私有仓库中下载镜像到本地 CPU使用率 CPU共享比例 CPU周期限制 CPU 配额控制参数的混合案例 内存限制 Block IO 的限制 限制bps 和iops 创建私有仓库 仓库&a…...

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

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

利用MMPreTrain微调图像分类模型
前言 MMPreTrain是一款基于PyTorch的开源深度学习预工具箱,是OpenMMLab项目的成员之一MMPreTrain的主要特性有: 支持多元化的主干网络与预训练模型支持多种训练策略(有监督学习,无监督学习,多模态学习等)提…...

express学习笔记3 - 三大件
便于统一管理router,创建 router 文件夹,创建 router/index.js: const express require(express)// 注册路由 const router express.Router() router.get(/,function(req,res){res.send(让我们开始express之旅) }) /*** 集中处理404请求的…...

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

三步问题(力扣)n种解法 JAVA
目录 题目:1、dfs:2、dfs 备忘录(剪枝):(1)神器 HashMap 备忘录:(2)数组 memo 备忘录: 3、动态规划:4、利用 static 的储存功能:&…...
flask---》登录认证装饰器/配置文件/路由系统
登录认证装饰器 # 0 装饰器的本质原理-# 类装饰器:1 装饰类的装饰器 2 类作为装饰器 # 1 装饰器使用位置,顺序 # 3 flask路由下加装饰器,一定要加endpoint-如果不指定endpoint,反向解析的名字都是函数名,不加装饰器…...
Jvm实际运行情况-JVM(十七)
上篇文章说jmap和jstat的命令,如何查看youngGc和FullGc耗时和次数。 Jmap-JVM(十六) Jvm实际运行情况 背景: 机器配置:2核4G JVM内存大小:2G 系统运行天数:7天 期间发生FULL GC次数和耗时…...

【BASH】回顾与知识点梳理(二)
【BASH】回顾与知识点梳理 二 二. Shell 的变量功能2.1 什么是变量?2.2 变量的取用与设定: echo, 变量设定规则: set/unset2.3 环境变量的功能用 set 观察所有变量 (含环境变量与自定义变量)export: 自定义变量转成环境变量那如何将环境变量转成自定义变…...
【分布式训练】Accelerate 多卡训练,单卡评测,进程卡住的解决办法
最近想把之前的一个模型的改成多卡训练的。我并不懂DDP,DP。一开始打算使用Transformers的Trainer,但是配置的过程踩了很多坑也没有弄成功。【我是自己写的评测方法,但是我找不到能让触发Trainer去用我的方法评测的路劲】,后来偶然…...

时间复杂度为O(nlogn)的两种排序算法
1.归并排序 归并排序的核心思想:如果要排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。 归并排序使用的就是分治思想。分治&#x…...
java调用onnx模型,支持yolov5和yolov7
不点star不给解答问题 可直接运行主文件:ObjectDetection_1_25200_n.java 或者 ObjectDetection_n_7.java 都可以直接运行两个可以运行的主文件是为了支持不用网络结构的模型,即使是onnx模型,输出的结果参数也不一样,支持以下两种…...

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

自监督去噪:Noise2Void原理和调用(Tensorflow)
文章原文: https://arxiv.org/abs/1811.10980 N2V源代码: https://github.com/juglab/n2v 参考博客: https://zhuanlan.zhihu.com/p/445840211https://zhuanlan.zhihu.com/p/133961768https://zhuanlan.zhihu.com/p/563746026 文章目录 1. 方法原理1.1 Noise2Noise回…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...