golang由于其能够支持大量并发运算的特性而广泛地应用于云计算领域。 本文对golang的底层进行一个简单的分析与说明。
golang runtime
go程序架构图
如上所示是golang程序运行过程中的架构图。
golang程序并没有像java一样自带虚拟机,而是和c类似。 每一个go程序都带有一个runtime,runtime负责和底层操作系统交互。
一个go程序运行所经过的几个主要步骤:
runtime实现比较复杂,在这里我们使用网上的一张图片 golang 是一门较为简单的语言,简单的语言并不代表不是优秀的语言。golang主要有三个feature。
协程(进程 线程)
进程: 进程是“程序执行的一个实例” ,担当分配系统资源的实体。进程创建必须分配一个完整的独立地址空间。
进程切换只发生在内核态,
线程:线程是进程的一个执行流,独立执行它自己的程序代码。
协程:协程不是进程或线程,其执行过程更类似于子例程,或者说不带返回值的函数调用。
在语言级别可以创建并发协程,然后编写代码去进行管理。go将这一步承包下来,使协程并发运行成本更低。
channel
channel是Go语言在语言级别提供的goroutine间的通信方式。我们可以使用channel在两个或 多个goroutine之间传递消息。
channel 会某种情况下出现阻塞,通过控制channel的阻塞来管理协程的并发与流程控制。
interface