go 管道问题 求解惑

mylzy159 · · 1048 次点击
package main import "log" type info struct { a int } func Handlego(i chan *info) { for { select { case info := <-i: log.Println("info-----", (*info).a) } } } func inputGo(i chan *info, num int) { for { iv := &info{ a: num, } i <- iv log.Println("input go", num, i) } } func main() { var i chan *info i = make(chan *info, 10) go Handlego(i) go inputGo(i, 1) for { } } 这是文字版本
#1
更多评论
稍微测试了下。 第一,你代码写错了。最后有一个空跑的循环。 第二。之所以会停,是因为要golang需要gc,但又因为你的循环在空跑,就一直在等待gc。 具体可以在你的inputGo里加一个 num++ 再在main加入debug.SetGCPercent(xx) 会发现每次停的位置和设置的gc优先度线性相关。
#2
``` func Handlego(i chan *info) { for { select { case info := <-i: log.Println("info-----", info.a) } } } func main() { num := 0 i := make(chan *info, 10) go Handlego(i) //go inputGo(i, 1) for { num++ iv := &info{a: num} i <- iv log.Println("input go", num, i) } } ``` 大概理解楼上大佬的意思,改写了一下,是因为空跑导致gc无法执行,具体解释还在查。。。有大佬解释一下吗
#3