package main
import (
"fmt"
"time"
)
type info struct {
Ch chan int
}
func goRun1(v *info) {
time.Sleep(time.Second *3)
v.Ch <- 1
fmt.Println("goRun1我这里等待了3秒钟后打印")
}
func goRun2() {
time.Sleep(time.Second *3)
fmt.Println("goRun2我这里等待了3秒钟后打印")
}
func main() {
var ch chan int
infoStruct := &info{Ch:ch}
go goRun1(infoStruct)
go goRun2()
for {
select {
case val, ok := <-ch:
if ok {
fmt.Println("这里是返回的ch值:", val)
return
}
case <-time.After(time.Second * 5):
fmt.Println("超时结束")
return
}
}
}
为什么我的 goRun1 函数并未执行,并且ch的值为什么没有被select 获取到呢?
你只声明了类型, 并没有创建实际的通道, 创建下通道就可以了var ch = make(chan int)
;
make函数是Go的内置函数,它的作用是为slice、map或chan初始化并返回引用。make仅仅用于创建slice、map和channel,并返回它们的实例。
记得点个采纳
infoStruct := &info{Ch:ch}
这里的ch只进行了声明,没有make,需要使用make来创建一个channel, 可以将var ch chan int 换成var ch = make(chan, int)