go 学习记录--如何运行

go 学习记录–如何运行#

个人一直觉得语法的学习不存在多大问题,咱们真正要了解的是程序如何运行。对于 go 语言的编译到运行其实还是一个比较有意思的过程,比如 go 的代码写完到底层的汇编代码是一个怎样的结构,通过了解底层的结构,我们应该如何去深入的学习 go。


导读#

  • go 程序编译执行
  • 再看汇编码
  • 思考总结

go 程序编译执行#

咱们先简单运行一个 go 的代码例子,看下要满足什么条件 go 才能编译执行

代码示例#

go 的文档肯定会告诉你,打包运行一个程序需要在 main 包下有一个 main 方法才行。
写了下面一段简单代码,咱们看下具体的操作流程

package main

import "fmt"

func main()  {
    fmt.Println("hello world")
}

上面代码写完之后咱们先运行一下,通过 go run 运行结果如下

咱们再把代码改一下 package 的 main 随便改一个名字试一下

果然就提示没有 main 的 package 不能运行
综上 go 的编译是先定位到 main package,然后找到 main 函数为入口开始


再看汇编码#

咱们先把代码 build 一下,具体生成如下文件

咱们再把生成的文件放到 IDA 里面反向查看一下,运行程序反向之后可以看到 N 多个函数。
可以注意到里面的函数的名字都是根据 go 里面的包名加函数名构成,比如_runtime_f32hash
就是在 go 的 runtime 包下的 f32hash 函数,这也再一次说明 go 没有像 java 一样的 class 这么一个玩意,而是由包和函数共同组成。

再通过过滤器查找一下 main 方法,果然找到了一个_main_main 的函数,如下图所示

咱们具体看一下 main 的汇编指令,其实就是输出一个 helloworld


思考总结#

总体来说通过上面的陈述,现在可以完全验证开头的问题了。

  • go 的垃圾回收等操作是在 runtime 包里面执行
  • go 是根据包和源代码文件里面的函数编译,和源文件关系不大
  • go 的编译运行必须存在 main 的 package 以及 main 的函数

最后各位可以扫下方二维码关注我公众号,基本每周会推送一到两篇的 go 学习记录,后续学完基础语法,会准备写一个 go 微服务项目,源码依然放在 github 上面。

avatar

本作品采用《CC 协议》,转载必须注明作者和本文链接