初级会员
  • 第 4752 位会员
  • sheepbao
  • 1421967301@qq.com
  • 2016-03-26 15:21:59
  • Offline
  • 19 38

最近分享的资源

    暂无

最近发布的项目

    暂无

最近的评论

  • 评论了主题 变量作用域的疑惑
    https://golang.google.cn/ref/spec#Short_variable_declarations 看语言规范就知道了 `=` 表示赋值 `:=` 表示分配且赋值 https://golang.google.cn/doc/faq#declarations_backwards ``` var a uint64 = 1 // has the same effect as a := uint64(1) ```
  • 评论了主题 零值 和 Nil 问题
    简单的说零值就是一个类型未经任何赋值的初始值, 比如 int类型的零值为0, bool类型的零值为false,*int的零值为nil。 而nil是一个特殊值,表示指针或者引用类型的一种值,比如 []byte=nil, *int32=nil, 在编译器看来其实nil就是0。
  • 评论了主题 关于go的调度问题
    https://github.com/sheepbao/golang_runtime_reading 前面的链接会报错
  • 评论了主题 关于go的调度问题
    关于goroutine的执行顺序官方文档肯定不会说谁先谁后,只会告诉你不要假设他们谁先谁后,因为并发就是这样规定的。不知道你假定goroutine的执行顺序有何意义?当然按照目前的runtime实现,指定一个P,创建少量的goroutine,是会先运行最后一个goroutinue,剩下的按照顺序依次运行。因为P的结构中有runnext字段用来保存最后新建的goroutine,M去找G来运行的时候也是优先找p的runnext。 但是这仅仅goroutine的没被抢占,M还未执行P本地队列中的G。如果你试试创建大量的G,就会发现goroutine的执行顺序并不符合你的说明。 详细的实现需要看runtime的具体代码,有兴趣可以一起阅读 https://github.com/sheepbao/golang_runtime_reading, 里面有我注释的golang 调度实现,可以回答你的问题。
  • 这个问题明明文档一开始就写了啊?go的内存模型就是这样的啊,文档例子里就有作者提的代码。[The Go Memory Model](https://golang.org/ref/mem) 中说了 `Within a single goroutine, reads and writes must behave as if they executed in the order specified by the program. That is, compilers and processors may reorder the reads and writes executed within a single goroutine only when the reordering does not change the behavior within that goroutine as defined by the language specification. Because of this reordering, the execution order observed by one goroutine may differ from the order perceived by another. For example, if one goroutine executes a = 1; b = 2;, another might observe the updated value of b before the updated value of a.` 大概意思就是 `不改变语言规范定义的行为时,编译器和处理器才可以重新排序在单个goroutine中执行的读取和写入。由于这种重新排序,一个goroutine观察到的执行顺序可能与另一个goroutine所感知的顺序不同。例如,如果一个goroutine执行a = 1; b = 2;,另一个可能会在a的更新值之前观察到b的更新值。` 也就是说对于题主的例子: ``` a = "hello, world" done = true ``` 在main goroutine看来a和done的顺序是不确定的,如果编译器和cpu进行了重排,就有可能done比a先执行的。