golang 中go函数可以开启一个携程
例如:
func main() {
fmt.Println("main start")
go func() {
fmt.Println("goroutine")
}()
time.Sleep(1 * time.Second)
fmt.Println("main end")
}
输出:
main start
goroutine
main end
func main() {
str := ""
go func() {
str = "goroutine"
}()
time.Sleep(1*time.Second)
fmt.Println(str)
}
输出:
goroutine
chan用法
// 声明不带缓冲的通道
ch1 := make(chan string)
// 声明带10个缓冲的通道
ch2 := make(chan string, 10)
// 声明只读通道
ch3 := make(<-chan string)
// 声明只写通道
ch4 := make(chan<- string)
func main() {
// 构建一个同步用的通道。
ch := make(chan int)
// 开启一个并发匿名函数
go func() {
fmt.Println("start goroutine")
// 匿名 goroutine 即将结束时,通过通道通知 main 的 goroutine,这一句会一直阻塞直到 main 的 goroutine 接收为止。
ch <- 0
fmt.Println("exit goroutine")
}()
fmt.Println("wait goroutine")
// 开启 goroutine 后,马上通过通道等待匿名 goroutine 结束。
<-ch //这里会一直等待写入完成整个通道才回结束
fmt.Println("all done")
}
func main() {
// 构建一个通道
ch := make(chan int)
// 开启一个并发匿名函数
go func() {
// 从3循环到0
for i := 3; i >= 0; i-- {
// 发送3到0之间的数值
ch <- i
// 每次发送完时等待
time.Sleep(time.Second)
}
}()
// 遍历接收通道数据
for data := range ch {
// 打印通道数据
fmt.Println(data)
//当接收到数值 0 时,停止接收。如果继续发送,由于接收 goroutine 已经退出,没有 goroutine 发送到通道,因此运行时将会触发宕机报错。
if data == 0 {
break
}
}
}
输出:
3
2
1
0