22

go学习记录--如何运行

 4 years ago
source link: https://segmentfault.com/a/1190000022103960
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

go学习记录--如何运行

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

导读

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

go程序编译执行

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

代码示例

go的文档肯定会告诉你,打包运行一个程序需要在main包下有一个main方法才行。

写了下面一段简单代码,咱们看下具体的操作流程

package main

import "fmt"

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

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

FNRNben.jpg!web

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

BVVBNzF.jpg!web

果然就提示没有main的package不能运行

综上go的编译是先定位到main package,然后找到main函数为入口开始

再看汇编码

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

NnARjmE.jpg!web

咱们再把生成的文件放到IDA里面反向查看一下,运行程序反向之后可以看到N多个函数。

可以注意到里面的函数的名字都是根据go里面的包名加函数名构成,比如_runtime_f32hash

就是在go的runtime包下的f32hash函数,这也再一次说明go没有像java一样的class这么一个玩意,而是由包和函数共同组成。

auqQryI.jpg!web

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

zimEZ3e.jpg!web

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

7NvQNz2.jpg!web

思考总结

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

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

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

EzER7rE.jpg!web


Recommend

  • 47
    • blog.sina.com.cn 6 years ago
    • Cache

    区块链学习记录01(6.21)

    区块链本质上是一个去中心化的分布式账本数据库,其本身是一串使用密码学相关联所产生的数据块,每一个数据块中包含了多次比特币网络交易有效确认的信息。 从这个定义来看,需要了解清楚去中心化的概念,区块的概念,区块组合组成链条,存...

  • 65

    本次分享下 -- PostgreSQL数据库驱动程序 为了保持项目的可学习性,我这里将之前分享的代码积累了下,放在github上,想要尽快入手学习的,可以直接clone我的代码,写代码不上手,都等于白搭,光看的话,对于我来说,我是不行的,...

  • 58

    完善Blog Model 前面的章节 我们分别介绍了MySQL、SQLite、PostgreSQL等数据库的使用 本节简单介绍并完善下我们自己的小博客的Model部分,这部分暂时先分享下Blog Model部分 这部分的完善其实很简单...

  • 66

    本次分享下 -- NoSQL数据库 - Redis数据库驱动程序 NoSQL数据库 NoSQL数据库提供了一种存储和检索数据的机制,该机制使用比典型的关系数据库更松散的一致性模型,以实现水平扩展和更高的可用性。 一些...

  • 108

    近段时间重新对我的Web应用程序进行了一些思考,首先程序启动的main.go文件中,暂时的路由添加没有太大的问题,但是根据以往的项目开发经验,如果这个系统对外分享的话,之后在做大项目的时候,会遇到添加很多路由的情况,然后就会发现文...

  • 33
    • blog.sina.com.cn 5 years ago
    • Cache

    谈服务运行日志记录(10.26)

    对应服务运行日志记录,在前面曾经谈过相关的文章,即给出了服务运行日志,注意包括了服务运行实例和服务运行实例详细输入和输出包括两个方面的内容。因此对于日志记录实际上就涉及到这方面内容如何处理。对于服务运行详细的输入和输出,其中输...

  • 43

  • 20
    • suiyia.github.io 3 years ago
    • Cache

    canal学习一:本地运行 canal

    canal学习一:本地运行 canal 2019-10-13 cana...

  • 0

    关于 PaddlePaddle(v2) 安装过程的一些折腾。注意现在 PaddlePaddle 已经全面升级到 fluid 版本,这篇笔记不一定适用于最新版本。 PaddlePaddle 是百度开源的 Deep Learning 框架,其定位应该是类似于 TensorFlow,优点是有相对完善的中文文档以及在 G...

  • 3

    强化学习在长时间运行系统中的限制 近日尝试使用强化学习解决8x8大小的2048游戏。游戏环境是一个8x8的方格,环境每回合随机生成2个方块,方块的值为2或4,AI的决策空间...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK