作者回复: 这个在前面的课程中讲到过,chan是一个结构,这个结构在传递时是被复制的,其中的指针成员也会被复制到新的chan中,所以新旧两个chan会指向同一个内存区域
作者回复: go语言是之传递的,所有如果不用指针,receiver中的wg将是一个副本并指向不同的地址空间,所以wg.Done()并不会是外部不同副本的wg.Wait()解除等待
作者回复: 这个我在讲座中有讲过: 1 Go语言是都是传值的, 2 chan是一个结构体,被复制后其中的成员仍指向同一内存区域,类似的还有slice和map
作者回复: 这是因为你用的是buffered chan他是非阻塞的。所以只要外面的主协程在退出前能有时间让他运行完,他就可以输出。 你可以在TestSelect最后退出前加一个sleep 1秒,你就会发现更短的timeout一样会输出那些信息
作者回复: 通道应该由生产者来关闭,在关闭的channel上发送数据程序会panic
作者回复: 在go test的运行程序中也要实用fmt输出,不要使用t.log. 通过go test -v运行
作者回复: WaitGroup类似于Channel这样的对象,他的定义是一个结构,虽然对象复制了,但是对象中成员还是指向同一地址空间的。
作者回复: 这部分不会有问题。
作者回复: 虽然,语句是串行的,是线程的调度不是
作者回复: 实际上和方法调用的直接传递复制是不同的,还是通过chan来完成的