Go语言进阶–基础概念

本系列文章到现在已经将Go非常基础的部分介绍完成了,后面就开始设计非常具有Go特色的内容了,因为之后会出现一系列的名词和概念,为了方便本篇先把这些基础概念和我的理解阐述一下。 首先Go是一门编译型语言,编译时产生一份本地可执行代码,但是这些代码其实是执行在go 的runtime上的。

runtime

runtime 可以大致理解为是Java中的虚拟机或者是一个调度器,主要负责管理内存分配、垃圾回收、栈操作、goroutine、channel、slice、反射等。

内存管理

Go 语言同Java类似帮助我们去管理内存,而不是C那样程序员自行管理。内存管理主要包含 内存分配、垃圾回收 两大部分: 内存分配器主要负责栈内存的分配及小对象的分配(小于32k的对象)。其中小对象的分配是通过多级cache 来实现的。

垃圾回收

go 的垃圾回收是一种非分代的、非紧锁的、写屏障的、并发标记清除的回收机制,看上不是不是感觉就是一个只有老年代区域并且使用的cms(Java 中的一种垃圾回收器),只是看上去像而已,具体的实现差异还是很大的,这个后续会单独介绍。

goroutine

goroutine 是go中设计最巧妙的地方所在,goroutine 是一种go 协程,相对于线程来说实现在用户空间下。

栈空间

当开启一个goroutine时,runtime会为goroutine分配一个栈空间(通常 8k左右),这个栈空间不是固定大小的,而是在runtine需要的时候动态分配栈空间。go 中的栈空间是分块式的,这个后续会详细介绍。

channel

管道是Go语言在语言级别上提供的goroutine间的通讯方式,我们可以使用channel在多个goroutine之间传递消息。channel是进程内的通讯方式,是不支持跨进程通信的,如果需要进程间通讯的话,可以使用类似于Socket、管道、信号量等进程间通信方式,关键字是chan。 概念的话暂时就这么多,后期会对每一个知识点进行剖析。