package main
import "fmt"
func main() {
// var ch1 chan int // 引用类型,需要初始化才能使用
// ch1 = make(chan int, 1)
// 简写
ch1 := make(chan int, 1) // 带缓冲区,异步操作
// ch1 := make(chan int) // 无缓冲区,必须有接收,又称为同步通道
ch1 <- 10
x := <-ch1
// len(ch1) // 获取通道长度
// cap(ch1) // 获取通道容量
fmt.Println(x)
close(ch1)
}
package main
import "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) {
// 从通道取值方式1
for {
tmp, ok := <-ch1
if !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)
// 从通道取值方式2
for res := range ch2 {
fmt.Println(res)
}
}
5个任务,最大同时工作3进程
package main
import (
"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个goroutine
for 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 main
import (
"fmt"
"sync"
)
var (
x int64
wg sync.WaitGroup
lock sync.Mutex // 互斥锁
)
func add() {
for i := 0; i < 5000; i++ {
lock.Lock() // 上锁
x = x + 1
lock.Unlock() // 释放锁
}
wg.Done()
}
func main() {
wg.Add(2)
go add()
go add()
wg.Wait()
fmt.Println(x)
}
正在学习Go语言的PHP程序员。