欢迎光临
我们一直在努力

初当Go学长第十二天

今天学习了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
}
}

以上记录纯属自身学习,欢迎大家给出意见,一起进步!

赞(0)
未经允许不得转载:171主机测评 » 初当Go学长第十二天
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址