初级会员
  • 第 11970 位会员
  • arestrack
  • jianggushi
  • 2017-09-05 08:25:00
  • Offline
  • 20 87

最近发布的主题

    暂无

最近发布的文章

    暂无

最近分享的资源

    暂无

最近发布的项目

    暂无

最近的评论

  • 这段代码中起了三个协程:主协程main,producer,square,创建了两个无缓冲的channel,这三个协程通过两个channel串联起来组成了一个pipeline。 ![DeepinScreenshot_select-area_20190116154131.png](https://static.studygolang.com/190116/e3b057c582fa3cc527fc865b36e65060.png) 从问题描述中看有几个关键点需要理解的: - channel 是引用类型(感觉你忽略了这点) - 无缓冲的 channel 读和写都是阻塞的 - for-range channel 会阻塞直到channel被关闭 大致流程: producer 中创建了一个无缓冲的 channel 叫做 out,并把这个channel作为返回值,同时起了一个协程向这个channel中写入1,2,3,4,最终关闭这个channel,协程退出。 producer 返回的 channel,作为入参,传递给了 square 换了个名字叫做 inCh。 square 中也创建了一个 channel 叫做 out,起了一个协程,从 inCh 中阻塞读数据,同时向 out 中阻塞写数据,写入 1, 4, 9, 16,最终关闭这个 channel,协程退出,并把 out 作为返回值返回。 main 中 for-range 从 square 中返回的 channel,直到这个 channel 关闭,主协程退出。
  • `fmt.Println(user, &user)` 使用的是默认格式的打印方式`%v`。 对于 `struct` 默认输出格式是 `{field0 field1 ...}`。 想要输出地址,需要使用 `%p`,`fmt.Printf("%v %p\n", user, &user)`。 还有一些的格式化方式: ``` fmt.Printf("%v %v\n", user, &user) fmt.Printf("%+v %+v\n", user, &user) fmt.Printf("%#v %#v\n", user, &user) ``` 更多的参考下文档:https://golang.google.cn/pkg/fmt/#hdr-Printing
  • arestrack@163.com 感谢楼主分享
  • 评论了主题 for和协程问题
    从结果看,第一段代码中其他协程饿死了,得不到调度。 简单点修改,不要让主协程一直占用CPU,可以在 for{}中加入 sleep。 ``` for { time.Sleep(time.Second) } ``` 更好的方式是使用 `sync.WaitGroup` 如果想要寻根问底,那就需要看看 go 调度原理了。