今天学习了select函数和协程超时的知识。
select:
package main
import (
"fmt"
"sync"
"time"
)
// 声明并初始化一个长度为0的信道
var moneyChan1 = make(chan int)
var nameChan1 = make(chan string)
// 声明一个用于关闭的信道
var doneChan = make(chan struct{})
func send(name string, money int, wait *sync.WaitGroup) {
fmt.Printf("%s 开始购物\\n", name)
time.Sleep(1 * time.Second)
fmt.Printf("%s 购物结束\\n", name)
//信道赋值语句
moneyChan1 <- money
nameChan1 <- name
wait.Done()
}
func main() {
var wait sync.WaitGroup
startTime := time.Now()
wait.Add(3)
go send("瞪眼", 2, &wait)
go send("小丸音", 3, &wait)
go send("瞪眼小丸音", 5, &wait)
//避免死锁
go func() {
defer close(moneyChan1)
defer close(nameChan1)
defer close(doneChan)
wait.Wait()
}()
var moneyList []int
var nameList []string
var event = func() {
for {
select {
case money := <-moneyChan1:
moneyList = append(moneyList, money)
case name := <-nameChan1:
nameList = append(nameList, name)
case <-doneChan:
return
}
}
}
event()
fmt.Println("购买完成", time.Since(startTime))
fmt.Println("moneyList", moneyList)
fmt.Println("nameList", nameList)
// go func() {
// for money := range moneyChan1 {
// moneyList = append(moneyList, money)
// }
// }()
// for name := range nameChan1 {
// nameList = append(nameList, name)
// }
//从上面拿值也用 <-
// for {
// money, ok := <-moneyChan
// fmt.Println(money, ok)
// if !ok {
// break
// }
// }
}
func event() {
}
协程超时:
package main
import (
"fmt"
"time"
)
var done = make(chan struct{})
func event() {
fmt.Println("event执行开始")
time.Sleep(2 * time.Second)
fmt.Println("event执行结束")
close(done)
}
func main() {
go event()
select {
case <-done:
fmt.Println("协程执行完毕")
case <-time.After(3 * time.Second):
fmt.Println("超时")
return
}
}
以上记录纯属自身学习,欢迎大家给出意见,一起进步!




