1.信道,就是一个管道,连接多个goroutine程序 ,它是一种队列式的数据结构,遵循先入先出的规则。
package main
import (
"fmt"
"time"
)
func chaninit() {
// 定义 信道实例 := make(chan 信道类型)
ch := make(chan int, 10)
// 信道的容量和长度
fmt.Println(cap(ch))
ch <- 12
fmt.Println(len(ch))
}
func increment(ch chan bool, x *int) {
ch <- true
*x = *x + 1
<-ch
}
func test_incr() {
// 注意要设置容量为 1 的缓冲信道
pipline := make(chan bool, 1)
var x int
for i := 0; i < 1000; i++ {
go increment(pipline, &x)
}
// 确保所有的协程都已完成
// 以后会介绍一种更合适的方法(Mutex),这里暂时使用sleep
fmt.Println("x 的值:0000", x)
time.Sleep(time.Second)
fmt.Println("x 的值:", x)
}
func for_test() {
pipeline := make(chan int)
go func() {
pipeline <- 100
}()
go func() {
num := <-pipeline
fmt.Println("receive", num)
}()
}
func main() {
test_incr()
time.Sleep(10 * time.Second)
}
package main
import (
"fmt"
"sync"
)
func test001() {
ch := make(chan bool)
go func() {
for i := 0; i < 5; i++ {
fmt.Println(i)
}
ch <- true
}()
<-ch
}
func worker(x int, wg *sync.WaitGroup) {
defer wg.Done()
for i := 0; i < 500; i++ {
fmt.Println(i)
}
}
func test002() {
var wg sync.WaitGroup
wg.Add(2)
go worker(1, &wg)
go worker(2, &wg)
wg.Wait()
}
func main() {
test001()
test002()
}
网友评论