goroutine
package main
import (
"fmt"
"time"
)
// go并发编程较为简单,可以比较容易地写出高并发应用
// go没有线程,只有协程,goroutine就是go中的协程
func asyncPrint() {
fmt.Println("这是协程打印的结果")
}
// main()函数本身就是一个主协程
func main() {
// 主死从随
// 非常简单地即可调用协程:只需要 go [函数名称] 就完成了多线程调用
//go asyncPrint()
// 使用匿名函数启动goroutine的方式
//go func() {
// fmt.Println("这是协程打印的结果")
//}()
// 启动多个匿名goroutine
// 1. 闭包
// 2. for循环的问题
for i := 0; i < 100; i++ {
// 这样直接打印结果,会出现很多重复的i值,这是因为for循环时,i变量会被重用,也因为协程运行速度太快,i值还来不及改变
//go func() {
// fmt.Printf("这是第 %d 个协程打印的结果\r\n", i)
//}()
// 第一种解决办法,重新声明一个变量temp,复制i的值
//temp := i
//go func() {
// fmt.Printf("这是第 %d 个协程打印的结果\r\n", temp)
//}()
// 第二种解决办法:利用值传递,更优雅
go func(i int) {
fmt.Printf("这是第 %d 个协程打印的结果\r\n", i)
}(i)
}
// 协程的启动和结束都是由系统自动管理,不需要我们手动去管理
defer fmt.Println("main goroutine end")
fmt.Println("main goroutine")
// 为了让main()主协程存活更久一些,让 go asyncPrint() 能够来得及打印出结果,需要等待一段时间
time.Sleep(1 * time.Second)
}
原创大约 11 分钟