go
文章平均质量分 55
镇杰。
这个作者很懒,什么都没留下…
展开
-
Go sync.WaitGroup
1 前言WaitGroup是Golang应用开发过程中经常使用的并发控制技术。WaitGroup,可理解为Wait-Goroutine-Group,即等待一组goroutine结束。比如某个goroutine需要等待其他几个goroutine全部完成,那么使用WaitGroup可以轻松实现。以下是1个goroutine等待另外2个goroutine结束的例子:package main import ( "fmt" "sync") func main() { var原创 2021-12-26 22:31:42 · 949 阅读 · 0 评论 -
go time.after
Golang time after典型用法time after触发,例子:package mainimport ( "fmt" "time")func main() { fmt.Println("Start Time =", time.Now()) a := time.After(5*time.Second) fmt.Println(<-a) fmt.Println("End Start Time =", time.Now())}程序运行后,输出如下图所示:我们看到,t原创 2021-12-19 23:14:37 · 1261 阅读 · 0 评论 -
go channel && select
channel 简介goroutine 是 Go 中实现并发的重要机制,channel 是 goroutine 之间进行通信的重要桥梁。channel 是一种go协程用以接收或发送消息的安全的消息队列,channel 就像两个go协程之间的导管,来实现各种资源的同步。声名创建 channel 常用两种方式,//方式1:使用make创建(必须定义其传递的数据类型)ch :make(chan int, 2) //创建缓冲通道ch :make(chan int) //创建非缓冲通道ch :mak原创 2021-12-19 22:44:15 · 882 阅读 · 0 评论 -
go常用锁Mutex和RWMutex
go常用锁Mutex和RWMutex转载 2021-12-16 10:03:09 · 698 阅读 · 0 评论 -
golang之race
由于golang中的go是非常方便的,加上函数又非常容易隐藏go。所以很多时候,当我们写出一个程序的时候,我们并不知道这个程序在并发情况下会不会出现什么问题。所以在本质上说,goroutine的使用增加了函数的危险系数。比如一个全局变量或公共变量,如果没有加上锁,我们写一个比较庞大的项目下来,就根本不知道这个变量是不是会引起多个goroutine竞争。看一下下面的例子,思考下val变量是否需要加锁?package main import( "fmt" "time") fun原创 2021-12-14 19:49:30 · 1282 阅读 · 0 评论 -
互斥锁、读写锁、自旋锁、悲观锁、乐观锁
互斥锁当有一个线程要访问共享资源(临界资源)之前,会对线程访问的这段代码(临界区)进行加锁。如果在加锁之后没释放锁之前其他线程要对临界资源进行访问,则这些线程会被阻塞睡眠,直到解锁,如果解锁时有一个或者多个线程阻塞,那么这些锁上的线程就会变成就绪状态,然后第一个变为就绪状态的线程就会获取资源的使用权,并且再次加锁,其他线程继续阻塞等待。特点:一次只能一个线程拥有互斥锁,其他线程只有等待应用场景:互斥锁会将操作串行化,可以保证操作完全有序,适合资源只能由一个协程进行操作的情况,并发能力弱;读写锁原创 2021-12-14 16:50:27 · 1955 阅读 · 0 评论 -
go语言 mutex锁
sync.Mutex 互斥锁type Mutex struct { // 包含隐藏或非导出字段}Mutex是一个互斥锁,可以创建为其他结构体的字段;零值为解锁状态。Mutex类型的锁和线程无关,可以由不同的线程加锁和解锁。Lockfunc (m *Mutex) Lock()Lock方法锁住m,如果m已经加锁,则阻塞直到m解锁。Unlockfunc (m *Mutex) Unlock()Unlock方法解锁m,如果m未加锁会导致运行时错误。锁和线程无关,可以由不同的线程加锁和解原创 2021-12-08 19:17:23 · 406 阅读 · 0 评论 -
go语言 func函数
一、函数定义函数是结构化编程中最小的模块单元,日常开发过程中,将复杂的算法过程分解为若干个小任务(代码块),使程序的结构性更清晰,程序可读性提升,易于后期维护和让别人读懂你的代码。编写多个函数的主要目的是将一个需要很多行代码的复杂问题分解为一系列简单的任务(那就是函数)来解决。在实际编程中,我们把重复性的任务抽象成一个函数。和所有的编程语言一样,Go语言支持各种风格的函数。在Go语言中,当函数执行到代码块最后一行 } 之前或者 return 语句的时候会退出,其中 return 语句可以带有零个或多个转载 2021-12-08 19:01:04 · 8701 阅读 · 0 评论 -
go语言 数组类型使用的坑
在 C/C++ 中,数组(名)是指针。将数组作为参数传进函数时,相当于传递了数组内存地址的引用,在函数内部会改变该数组的值。在 Go 中,数组是值。作为参数传进函数时,传递的是数组的原始值拷贝,此时在函数内部是无法更新该数组的。// 数组使用值拷贝传参func main() { x := [3]int{1,2,3} func(arr [3]int) { arr[0] = 9 fmt.Println(arr) // [9 2 3] }(x) fmt.Println(x) // [原创 2021-10-28 18:33:57 · 217 阅读 · 0 评论 -
go语言for循环break、continue高级用法
break:break 语句可以结束 for、switch 和 select 的代码块。break 语句还可以在语句后面添加标签**(即下面代码中的BreakTag、BreakTag2)**,表示退出某个标签对应的代码块,标签要求必须定义在对应的 for、switch 和 select 的代码块上。 BreakTag: for i := 0; i < 5; i++ { BreakTag2: for j := 0; j < 4; j++ { fmt.Println(原创 2021-10-28 17:40:30 · 2711 阅读 · 0 评论 -
go语言for循环多变量使用
go for循环语法为: /* init: 一般为赋值表达式,给控制变量赋初值; condition: 关系表达式或逻辑表达式,循环控制条件; post: 一般为赋值表达式,给控制变量增量或减量。 */ for init; condition; post { //...... }使用多个变量时,使用平行赋值,需要留意的是 post处 的写法,代码如下:/* 错误写法: 1.不符合for init; condition; post { }格式,多变量赋值只能使用平行赋值; 2原创 2021-10-28 17:17:06 · 1207 阅读 · 0 评论 -
golang下划线的三种用法
1.忽略返回值这个应该是最简单的用途,比如某个函数返回三个参数,但是我们只需要其中的两个,另外一个参数可以忽略,这样的话代码可以这样写:v1, v2, _ := function(...)2.用在变量(特别是接口断言)例如我们定义了一个接口(interface):type Food interface { Eat()}然后定义了一个结构体(struct)type Water struct {}然后我们希望在代码中判断 Water 这个struct是否实现了 Food 这个原创 2021-10-27 14:04:51 · 648 阅读 · 0 评论