Go 运行机制
go 运行时,也称为 go runtime。其本身就是每个 go 程序的一部分,它会跟你的源码一起编译并连接到目标程序中。即便你的代码只是写了一个 hello world 功能,编译成二进制程序后,这个程序中也包含了 runtime 的实现。
它在程序中具体负责什么?runtime 负责实现 Go 的垃圾收集、并发、内存堆栈管理、协程调度器以及 Go 语言的其他关键功能。
go源码编译成go程序后,go程序无需依赖独立安装的go运行时。(与java这种依赖JVM解析运行的编程语言不同)
为什么Go语言适合现代的后端编程环境?
- 服务类应用以API居多,IO密集型,且网络IO最多;
- 运行成本低,无VM。网络连接数不多的情况下内存占用低;
- 强类型语言,易上手,易维护;
为什么适合基础设施?
- k8s、etcd、istio、docker已经证明了Go的能力
Go语言的编译过程
使用go build -x xxx.go可以观察这个过程
不同系统的可执行文件规范
以Linux的可执⾏⽂件ELF(Executable and Linkable Format) 为例,ELF 由⼏部分构成:
- ELF header
- Section header
- Sections
操作系统执行可执行文件的步骤(Linux为例):
如何寻找Go进程的入口
通过 entry point 找到 Go进程的执⾏⼊⼝点,使⽤readelf
⼊⼝点指向编译后的main函数