今天学习了信道相关的知识。
信道长度为0说明只能一边取,一边放,不能暂放,长度为n时说明一边可以暂存n个信息,第n+1个信息需要等待另一方取走才可继续放入。
Val是value的缩写,常用作变量名,表示一个临时值或者参数值。
Channel<-val表示写,val<-channel表示读。
package main
import (
"fmt"
"sync"
"time"
)
// 声明并初始化一个长度为0的信道
var moneyChan = make(chan int)
func pay(name string, money int, wait *sync.WaitGroup) {
fmt.Printf("%s 开始购物\\n", name)
time.Sleep(1 * time.Second)
fmt.Printf("%s 购物结束\\n", name)
//信道赋值语句
moneyChan <- money
wait.Done()
}
func main() {
var wait sync.WaitGroup
startTime := time.Now()
wait.Add(3)
go pay("瞪眼", 2, &wait)
go pay("小丸音", 3, &wait)
go pay("瞪眼小丸音", 5, &wait)
//避免死锁
go func() {
defer close(moneyChan)
wait.Wait()
}()
var moneyList []int
for money := range moneyChan {
moneyList = append(moneyList, money)
fmt.Println(money)
}
//从上面拿值也用 <-
// for {
// money, ok := <-moneyChan
// fmt.Println(money, ok)
// if !ok {
// break
// }
// }
fmt.Println("购买完成", time.Since(startTime))
fmt.Println("moneyList", moneyList)
}
以上记录纯属自身学习,欢迎大家一起讨论,一起进步!

