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

最近分享的资源

    暂无

最近发布的项目

    暂无

最近的评论

  • ``` eface = (interface{})(*(*interface {M()})(v.ptr)) // 就是两次类型转换 ``` 先看 `(*interface {M()})(v.ptr)` 表示类型转换,其中 `*interface {M()})` 表示匿名接口类型指针,接口的方法函数只有一个,就是`M()`,这语句整体意思就是将`v.ptr`转为`(*interface {M()})`类型。 接着再解指针,再进行一次类型转换,转为` (interface{})` ,也就是空接口。
  • 代码用了cgo吧?
  • ![image.png](https://static.studygolang.com/190114/a9ebec7cee10491878c5c4ea65b66c61.png) 直接加我微信,我拉你
  • https://sheepbao.github.io/post/understand_golang_slice/ 可以看我这篇文章。
  • 我的理解P一开始不属于任何一个M,P是逻辑cpu它和M绑定了,那么它就能真正的执行指令了,因为M就是系统线程。P也可以和M解绑,比如进程进入系统调用比较久,P就会和M解绑,让M等待系统调用,而P就去另寻新欢了,也就是找一个新的M2来和P绑定,继续执行执行P上面的G。 问题的回答:P本身不一定位于一个线程M上,P与M的关系是M:N的关系。我觉得P最关键的作用是存着G的队列和本地缓存。 有兴趣可以自己runtime源码: 加深理解 https://github.com/sheepbao/golang_runtime_reading 欢迎star和加入群