文章摘要
这篇文章介绍了Go语言中使用`sync.WaitGroup`和`defer`关键字实现的两个协程函数`Test01`和`Test02`。`Test01`是一个简单的循环协程,输出`"协程01循环输出:"`以及五个循环迭代的结果。`Test02`则依赖于`Test01`的运行,并在`Test01`完成后启动。特别地,当`Test02`中的循环变量`i`等于3时,它会触发`defer`内部的`Goexit()`,从而提前退出循环并结束运行。文章通过代码示例展示了协程之间的依赖关系和同步控制机制。
// 定义两个函数,Test01和Test02
// Test02在Test01运行结束之后运行
// 并且Test02在i=3的时候结束运行
//Test01
func Test01(wg *sync.WaitGroup) {
defer func() {
fmt.Println(“Test01结束!”)
wg.Done()
}()
fmt.Println(“协程01循环输出:”)
for i :=0; i < 5; i++ {
fmt.Println(“协程01 -“, i)
}
}
// Test02
func Test02(wg *sync.WaitGroup) {
defer func() {
fmt.Println(“Test02结束!”)
wg.Done()
}()
// 等待Test01运行结束
runtime.Gosched()
fmt.Println(“协程02循环输出:”)
for i :=0; i < 5; i++ {
if i==3 {
fmt.Println(“i=3 退出!”)
// 当i=3时执行defer里的语句然后退出
runtime.Goexit()
}
fmt.Println(“协程02 -“, i)
}
}
// main函数调用
func main() {
var wg sync.WaitGroup
wg.Add(2)
go Test01(&wg)
go Test02(&wg)
wg.Wait()
fmt.Println(“This is main function!”)
}
// Test02在Test01运行结束之后运行
// 并且Test02在i=3的时候结束运行
//Test01
func Test01(wg *sync.WaitGroup) {
defer func() {
fmt.Println(“Test01结束!”)
wg.Done()
}()
fmt.Println(“协程01循环输出:”)
for i :=0; i < 5; i++ {
fmt.Println(“协程01 -“, i)
}
}
// Test02
func Test02(wg *sync.WaitGroup) {
defer func() {
fmt.Println(“Test02结束!”)
wg.Done()
}()
// 等待Test01运行结束
runtime.Gosched()
fmt.Println(“协程02循环输出:”)
for i :=0; i < 5; i++ {
if i==3 {
fmt.Println(“i=3 退出!”)
// 当i=3时执行defer里的语句然后退出
runtime.Goexit()
}
fmt.Println(“协程02 -“, i)
}
}
// main函数调用
func main() {
var wg sync.WaitGroup
wg.Add(2)
go Test01(&wg)
go Test02(&wg)
wg.Wait()
fmt.Println(“This is main function!”)
}
© 版权声明
文章版权归作者所有,未经允许请勿转载。