channel/test2有缓冲的channel,channel/test3显式关闭channel,channel/test4主进程用for..range从channel读数据

This commit is contained in:
wandoubaba 2024-11-20 11:41:06 +08:00
parent 4105f63f1f
commit 69e53c2d4b
4 changed files with 84 additions and 2 deletions

View File

@ -9,11 +9,11 @@ func main() {
go func() { go func() {
defer fmt.Println("goroutine 结束") defer fmt.Println("goroutine 结束")
fmt.Println("goroutine 正在运行...") fmt.Println("goroutine 正在运行...")
// 将值发送给c // go程中将值发送给c
c <- 666 c <- 666
}() }()
// 读c中的数据并赋值给num // 主线程中:读c中的数据并赋值给num
num := <-c num := <-c
fmt.Println("num = ", num) fmt.Println("num = ", num)
fmt.Println("main goroutine 结束 ...") fmt.Println("main goroutine 结束 ...")

View File

@ -0,0 +1,35 @@
// 有缓冲的channel
package main
import (
"fmt"
"time"
)
func main() {
c := make(chan int, 3) // 带有缓冲的channel
fmt.Println("len(c) = ", len(c), ", cap(c) = ", cap(c))
// 做一个go程
go func() {
defer fmt.Println("子go程结束")
// 如果循环3将不会阻塞大于3就会阻塞
for i := 0; i < 4; i++ {
// 把i传递给channel
c <- i
fmt.Println("子go程正在运行, 发送元素: ", i, ", len(c) = ", len(c), ", cap(c) = ", cap(c))
}
}()
time.Sleep(2 * time.Second)
for i := 0; i < 4; i++ {
num := <-c
fmt.Println("num = ", num)
// 如果这里不阻塞的话那么子go程在第2轮之后有可能不会打印
time.Sleep(1 * time.Second)
}
fmt.Println("主进程main结束")
}

View File

@ -0,0 +1,27 @@
package main
import "fmt"
func main() {
c := make(chan int)
go func() {
for i := 0; i < 5; i++ {
c <- i
}
// close可以关闭一个channel
close(c)
}()
for {
// 如果ok为true表示channel没有关闭如果ok为false表示channel已经关闭
if data, ok := <-c; ok {
fmt.Println(data)
} else {
fmt.Println("channel c 已被关闭")
break
}
}
fmt.Println("Main finished ...")
}

View File

@ -0,0 +1,20 @@
package main
import "fmt"
func main() {
c := make(chan int)
go func() {
for i := 0; i < 5; i++ {
c <- i
}
close(c)
}()
for data := range c {
fmt.Println(data)
}
fmt.Println("Main finished ...")
}