Golang源码探索(二) 协程的实现原理

Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱, 虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻底的. 这篇文章将通过分析golang的源代码来讲解协程的实现原理. 这个系列分析的golang源代码是Google官方的实现的1.9.2版本, 不适用于其他版本和gccgo等其他实现, 运行环境是Ubuntu 16.04 LTS 64bit. 核心概念 要理解协程的实现, 首先需要了解go中的三个...阅读全文

阅读:25020 评论:5

一个奇怪的golang等值判断问题

问题场景 分析一下,下面代码的输出是什么(判断a==c)的部分 package main import ( "fmt" "runtime" ) type obj struct{} func main() { a := &obj{} fmt.Printf("%p\n", a) c := &obj{} fmt.Printf("%p\n", c) fmt.Println(a == c) } 很多人可能一看,a和c完全是2个不同的对象实例,便认为a和c具备不同的内存地址,故而判断a==c的结果为fals...阅读全文

2019.04.03 23:35 海角之南
阅读:1224 评论:0

详尽干货!从源码角度看 Golang 的调度

桔妹导读:本章主要从源码角度针对Go调度相关进行分析,从进程的启动,到调度循环分析,再到分析几个常见runtime下的场景可以清晰的了解调度过程。本文仅关注linux系统下的逻辑。代码版本参考Go1.9.2。—————▍阅读索引1.简单概念1.1 调度器的三个抽象概念:G、M、P1.2 调度的大致轮廓2.进程启动时都做了什么2.1 runtime.osinit(SB)方法针对系统环境的初始化2.2 runtime.schedinit(SB)调度相关的一些初始化2.3 runtime·mainPC...阅读全文

2019-05-24 08:57:28 滴滴技术
阅读:2373 评论:0