package mainimport "fmt"func main() {// var ch1 chan int // 引用类型,需要初始化才能使用// ch1 = make(chan int, 1)// 简写ch1 := make(chan int, 1) // 带缓冲区,异步操作// ch1 := make(chan int) // 无缓冲区,必须有接收,又称为同步通道ch1 <- 10x := <-ch1// len(ch1) // 获取通道长度// cap(ch1) // 获取通道容量fmt.Println(x)close(ch1)}
package mainimport "fmt"// 两个goroutine,两个channel// 1.生成0~100的数字发送到ch1中// 2.从ch1中取出数据计算它的平方,把结果发送到ch2中// 存值// 生成0-100的数字发送到ch1中func fn1(ch chan<- int) {for i := 0; i < 100; i++ {ch <- i}close(ch)}func fn2(ch1 <-chan int, ch2 chan<- int) {// 从通道取值方式1for {tmp, ok := <-ch1if !ok {break}ch2 <- tmp * tmp}close(ch2)}func main() {ch1 := make(chan int, 100)ch2 := make(chan int, 200)go fn1(ch1)go fn2(ch1, ch2)// 从通道取值方式2for res := range ch2 {fmt.Println(res)}}
5个任务,最大同时工作3进程
package mainimport ("fmt""time")func worker(id int, jobs <-chan int, results chan<- int) {for j := range jobs {fmt.Printf("worker:%d start job:%d\n", id, j)time.Sleep(time.Second)fmt.Printf("worker:%d end job:%d\n", id, j)results <- j * 2}}func main() {jobs := make(chan int, 100)results := make(chan int, 100)// 开启3个goroutinefor w := 1; w <= 3; w++ {go worker(w, jobs, results)}// 5个任务for j := 1; j <= 5; j++ {jobs <- j}close(jobs)// 输出结果for a := 1; a <= 5; a++ {<-results}}
package mainimport ("fmt""sync")var (x int64wg sync.WaitGrouplock sync.Mutex // 互斥锁)func add() {for i := 0; i < 5000; i++ {lock.Lock() // 上锁x = x + 1lock.Unlock() // 释放锁}wg.Done()}func main() {wg.Add(2)go add()go add()wg.Wait()fmt.Println(x)}
正在学习Go语言的PHP程序员。