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

news2024/11/24 22:33:10

package

在这里插入图片描述

1_1_User.go

package user

type User struct {
	Name string
}

1_1_UserGet.go

package user

func GetCourse(c User) string {
	return c.Name
}

1_1_UserMain.go

package main

import (
	"fmt"
	Userch03 "goproj/IMOOC/ch03/user"//别名,防止同名歧义
)

func main() {
	c := Userch03.User{
		Name: "hi,user",
	}
	fmt.Println(Userch03.GetCourse(c))
}

gin

github链接

package main

import (
  "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 main

func add(a, b int) int {
	return a + b
}
package main

import "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   int
		b   int
		out 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 = 10000

func BenchmarkStringSprintf(b *testing.B) {
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		var str string
		for 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 string
		for 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.Builder
		for j := 0; j < numbers; j++ {
			builder.WriteString(strconv.Itoa(j))
		}
		_ = builder.String()
	}
	b.StopTimer()
}

并发编程

package main

import (
	"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 main

import (
	"fmt"
	"sync"
)

func main() {
	var wg sync.WaitGroup
	wg.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 main

import (
	"fmt"
	"sync"
	"sync/atomic"
)

var total int32
var wg sync.WaitGroup
var lock sync.Mutex

func 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 main

import (
	"fmt"
	"sync"
	"time"
)

func main() {
	var rwlock sync.RWMutex
	var wg sync.WaitGroup

	wg.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 main

import "fmt"

func main() {
	//有缓存
	var msg1 chan string
	msg1 = make(chan string, 1) //1是缓存空间大小
	msg1 <- "harry"
	data := <-msg1
	fmt.Println(data)
	
	//无缓存,happen-before机制
	var msg2 chan string
	msg2 = make(chan string, 0)
	go func(msg2 chan string) {
		data2 := <-msg2
		fmt.Println(data2)
	}(msg2)
	msg2 <- "potter"
	
	var msg3 chan int
	msg3 = make(chan int, 2)
	go func(msg3 chan int) {
		for data3 := range msg3 {
			fmt.Println(data3)
		}
		fmt.Println("all done")
	}(msg3)
	msg3 <- 1
	msg3 <- 2
	close(msg3)

	var ch1 chan int   //双向
	var ch2 chan<- int //只写入
	var ch3 <-chan int //只读取
	
	c := make(chan int, 3)
	var send chan<- int = c
	var receive <-chan int = c
}

打印数字和字母

package main

import (
	"fmt"
	"time"
)

var number, letter = make(chan bool), make(chan bool)

func printNum() {
	i := 1
	for {
		<-number
		fmt.Printf("%d%d", i, i+1)
		i += 2
		letter <- true
	}`在这里插入代码片`
}

func printLetter() {
	i := 0
	str := "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
	for {
		<-letter
		if i >= len(str) {
			return
		}
		fmt.Print(str[i : i+2])
		i += 2
		number <- true
	}
}

func main() {
	go printNum()
	go printLetter()
	number <- true
	time.Sleep(100 * time.Second)
}

select

package main

import (
	"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 main

import (
	"fmt"
	"sync"
	"time"
)

var wgc sync.WaitGroup

func cpuInfo(stop chan struct{}) {
	defer wgc.Done()
	for {
		select {
		case <-stop:
			fmt.Println("退出CPU监控")
			return
		default:
			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 main

import (
	"context"
	"fmt"
	"sync"
	"time"
)

var wgc2 sync.WaitGroup

func cpuInfo2(ctx context.Context) {
	defer wgc2.Done()
	for {
		select {
		case <-ctx.Done():
			fmt.Println("退出CPU监控")
			return
		default:
			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("监控完成")
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/819963.html

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

相关文章

HarmonyOS/OpenHarmony元服务开发-配置卡片的配置文件

卡片相关的配置文件主要包含FormExtensionAbility的配置和卡片的配置两部分&#xff1a; 1.卡片需要在module.json5配置文件中的extensionAbilities标签下&#xff0c;配置FormExtensionAbility相关信息。FormExtensionAbility需要填写metadata元信息标签&#xff0c;其中键名称…

论文解读|2020 CVPR:PointASNL:基于自适应采样的非局部神经网络点云鲁棒处理

原创 | 文 BFT机器人 01 背景 点云是由大量的点组成的三维数据集&#xff0c;通常由激光雷达或摄像机等传感器采集。点云数据处理是计算机视觉和机器学习领域的重要研究方向&#xff0c;应用广泛&#xff0c;例如自动驾驶、机器人导航、三维建模等。然而&#xff0c;点云数据通…

CCIA数安委等组织发起“个人信息保护影响评估专题工作”,合合信息首批入选试点

近期&#xff0c;“个人信息保护影响评估专题工作”&#xff08;简称“PIA专题工作”&#xff09;试点评估结果正式发布。PIA专题工作组由中国电子技术标准化研究院、中国信息通信院等单位的法律与技术专家组成&#xff0c;对试点申报单位开展PIA工作的过程是否符合评估依据提出…

bigemap工程行业应用

类似这种看布置&#xff0c;修温室大棚&#xff0c;再就是把影像添加到cad里。落坐标点 是因为觉得地图影像清晰&#xff0c;更新及时能直接用软件做等高线地形图进行投影转换配合cad来使用直接在线下载卫星图和高程节省测绘时间&#xff0c;以及手机端去做数据的采集&#xff…

我为“IT教父”柳传志的名言画蛇添足

我为“IT教父”柳传志的名言画蛇添足 搭班子&#xff0c;定战略&#xff0c;带队伍 添两条足&#xff1a;配资源&#xff0c;拼打法 趣讲大白话&#xff1a;教父还是很牛&#xff0c;被恶意黑化了 【趣讲信息科技243期】 **************************** 搭班子&#xff1a;是一条…

Bootstrap框架(JavaScript组件)

目录 前言一&#xff0c;JavaScript插件简介二&#xff0c;插件的引入方式三&#xff0c;data属性四&#xff0c;关闭data属性五&#xff0c;过渡插件六&#xff0c;模态框6.1&#xff0c;JavaScript操作模态框6.2&#xff0c;模态框属性6.3&#xff0c;模态框方法6.4&#xff…

如何运行疑难解答程序来查找和修复Windows 10中的常见问题

如果Windows 10中出现问题&#xff0c;运行疑难解答可能会有所帮助。疑难解答人员可以为你找到并解决许多常见问题。 一、在控制面板中运行疑难解答 1、打开控制面板&#xff08;图标视图&#xff09;&#xff0c;然后单击“疑难解答”图标。 2、单击“疑难解答”中左上角的…

无涯教程-jQuery - position( )方法函数

position()方法获取元素相对于其偏移父级的顶部和左侧位置。 返回的对象包含两个Integer整数属性&#xff0c;即top和left。为了进行准确的计算&#xff0c;请确保将像素值用于边距&#xff0c;边框和填充。此方法仅适用于可见元素。 position( ) - 语法 selector.position(…

StopWatch与ThreadLocal

目录 1、StopWatch 1、1作用&#xff1a; 1、2方法&#xff1a; 1、3使用方法 2、ThreadLocal 2、1什么是ThreadLocal 2、2简单例子 2、3使用ThreadLocal带来的四个好处 2、4主要方法 2、5ThreadLocal内存泄漏问题 1、StopWatch 1、1作用&#xff1a; 统计代码块耗时时…

【前端|CSS系列第4篇】面试官:你了解居中布局吗?

欢迎来到前端CSS系列的第4篇教程&#xff01;如果你正在寻找一种简单而又强大的前端技术&#xff0c;以使你的网页和应用程序看起来更加专业和美观&#xff0c;那么居中布局绝对是你不能错过的重要知识。 在前端开发中&#xff0c;实现居中布局是一项必备技能&#xff0c;无论…

DC电源模块输出电压的调节范围

BOSHIDA DC电源模块输出电压的调节范围 DC电源模块是一种可以将交流电转换为直流电的设备&#xff0c;可以广泛应用于电子、通信、工业自动化等领域。在实际使用中&#xff0c;输出电压的调节范围非常重要&#xff0c;因为它决定了该模块能够适应的电器设备的种类和使用范围。…

(自控原理)自动控制的一般概念

1、自动控制理论发展简史 1.1经典控制理论&#xff08;19世纪初—20世纪50年代) 时域法 复域法(根轨迹法) 频域法 1.2 现代控制理论&#xff08;20世纪60年代—&#xff09; 线性系统 自适应控制预测控制 最优控制 鲁棒控制 滑模控制 最佳估计 容错控制 大系统复杂系统 系…

golang自带的命令行解析库flag库实践

1. 简介 flag用于解析命令行选项。有过类 Unix 系统使用经验的童鞋对命令行选项应该不陌生。例如命令ls -al列出当前目录下所有文件和目录的详细信息&#xff0c;其中-al就是命令行选项。 命令行选项在实际开发中很常用&#xff0c;特别是在写工具的时候。 指定配置文件的路径…

高压开关柜温度在线监测系统设计

摘要&#xff1a;在当前的社会之中&#xff0c;电力资源是最重要的能源资源之一&#xff0c;人们对于电力资源的依赖程度也逐渐升高&#xff0c;到目前为止&#xff0c;任何人的生活与工作都不能离开电力资源&#xff0c;这就导致电力系统的普及型大大提高。电力系统具有着极高…

小程序原生实现左右锚点联动

效果 wxml <view classbox><scroll-view scroll-y scroll-with-animation style"width:25%"><view classnav><view wx:for"{{navList}}" wx:keyindex class"title {{index active ?select:}}"data-index{{index}} bin…

el-select 中加了filterable 点击箭头下拉框回收不去问题

解决方式①&#xff1a;参考连接&#xff1a;&#xff08;亲测有用&#xff09;【element-select】添加过滤属性以及change后下拉框异常_element select过滤时,不收起下拉框_Y.哈哈的博客-CSDN博客 1、添加过滤属性后点击下箭头不收起下拉框 2、change通过dialog触发事件后&…

新能源光学膜厚测量仪

能源是人类社会可持续发展的动力源泉和重要生存基础。近年来&#xff0c;新能源的研究受到世界各国的高度重视&#xff0c;包括太阳能、风能和潮汐能等在内的可再生能源正在成为传统化石燃料有希望的替代品&#xff0c;因此&#xff0c;开发低成本、大规模的能源转换技术与新型…

【laravel+vue2 】医院信息化手术麻醉临床信息管理系统源码

近年来&#xff0c;医院信息化成为医院领域的推广重点&#xff0c;HIS、LIS、PACS、EMR等信息系统的相继出现&#xff0c;显著提高了医院业务的运行效率。手术麻醉系统作为医院信息系统的一部分&#xff0c;由监护设备数据采集系统和麻醉信息管理系统两个子系统组成。 一、医院…

【LeetCode】【数据结构】单链表OJ常见题型(一)

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负。 目录 前言&#xff1a; 【LeetCode】203.移除链表元素 【LeetCo…

不同语言操作符的优先级

看到标题&#xff0c;可能会心生疑惑: 这么基础且重要的操作&#xff0c;不同语言不应该是一致的吗&#xff1f; 并不一定&#xff0c;比如对于右移运算和加法运算&#xff0c;Go就与其他多数语言表现得不一致&#xff1a; Go: package mainimport "fmt"func main() …