go学习记录--如何运行

A1len · · 1105 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

go学习记录--如何运行

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

导读

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

go程序编译执行

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

代码示例

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

package main

import "fmt"

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

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

1584865935717.jpg

咱们再把代码改一下package的main随便改一个名字试一下
1584865984895.jpg
果然就提示没有main的package不能运行
综上go的编译是先定位到main package,然后找到main函数为入口开始


再看汇编码

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

1584866362804.jpg

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

1584866523886.jpg

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

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


思考总结

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

  • go的垃圾回收等操作是在runtime包里面执行
  • go是根据包和源代码文件里面的函数编译,和源文件关系不大
  • go的编译运行必须存在main的package以及main的函数
最后各位可以扫下方二维码关注我公众号,基本每周会推送一到两篇的go学习记录,后续学完基础语法,会准备写一个go微服务项目,源码依然放在github上面。

avatar


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:A1len

查看原文:go学习记录--如何运行

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1105 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传