go语言的看(te)点(se)在哪里( 三 )
for { if s.closed { close(s.updates) return } items, next, err := s.fetcher.Fetch() if err != nil { s.err = err time.Sleep(10 * time.Second) continue } for _, item := range items { s.updates \u0026lt;- item } if now := time.Now(); next.After(now) { time.Sleep(next.Sub(now)) } }loop线程是一个无线循环,主线程可以调用Close()方法停止loop线程:func (s *naiveSub) Close() error { s.closed = true return s.err}可以看出,对s.closed和s.err的读写会造成各种race,其中一种如下图所示。
【go语言的看(te)点(se)在哪里】
可以使用channel避免race:通过在loop线程监听s.closing(类型是chan chan error),得到errc(类型是chan error),通过它来传输err。func (s *sub) Close() error { errc := make(chan error) s.closing \u0026lt;- errc return \u0026lt;-errc}新的loop线程: var err error // set when Fetch fails for { select { case errc := \u0026lt;-s.closing: errc \u0026lt;- err close(s.updates) // tells receiver we\u0026#39;re done return\t\t...\t\t... } }============我也是初学golang,刚从学校滚蛋的毕业生一枚,从事linux c++编码工作,对java了解比较少,答案中不对的地方还请各位指教~
推荐阅读
- 银行高管的薪酬结构图表最新的,请问在哪里可以收集
- OC为何跌出语言榜前十
- 坐标合肥,请问在哪里能捕捉到程序员这种生物他们大都出现在哪里呢
- dart这编程语言现在发展怎么样了,语法与Java,c#很相似,甚至更简洁
- 人民车市|新语言、新起点,捷达VS7 强势入局
- 汽车|滴滴的新欢PK旧爱:D1对比e5强在哪里
- 未来电子商务的爆发点在哪里
- C语言 指针引用数组的地址问题
- 零基础入门学习啥语言好
- 营销型外贸网站用哪种建站程序和语言比较好呢主要是适合优化,可扩展兼容性,安全性,后期网站扩展升级
