golang 函数调用栈笔记

 

一个被函数在栈上的情况:(栈从高地址向低地址延伸)

  • 返回地址(函数执行结束后,会跳转到这个地址执行)
  •  BP(函数的栈基)
  • 局部变量
  • 返回值(指的是函数返回值,eg: a := function() ,这里的a就是返回值)(golang现在将返回值存到寄存器?待确认)
  • 参数
  • SP(函数栈指针)

函数栈帧会一次性分配,然后通过sp + 偏移量的方式来定位位置,当一个函数内调用多个函数时,会根据最大的函数栈帧来给每个函数分配栈帧。

call指令

在调用函数时,编译器会执行call指令,call指令主要有两步操作:

  1. 将下一条指令的地址入栈 (这里的下一条指令地址也就是返回地址)
  2. 将ip寄存器指向代码段的被调用函数处

ret指令

当函数执行完成后,编译器会执行ret指令:

  1. 将返回地址弹出
  2. 跳转到返回地址

一个函数被调用的完整顺序

call指令 ——> sp指针向下移动,分配足够大栈帧空间 ——> 将调用者栈基bp复制入栈(为区分记为bp1)——>将bp1存到寄存器——>执行函数——>将寄存器的值恢复为bp——>释放栈帧——> ret指令

return与defer的执行顺序:

  1. return给返回值赋值
  2. defer函数执行
  3. return返回返回值


详情见幼麟实验室 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是一个基于 Golang开发技术案例: 1. Golang 语言 Golang 是 Google 推出的一门编程语言,它具有静态类型、高效性能、垃圾回收等特性,被广泛用于构建高性能、可靠的后端服务。 2. Gin 框架 Gin 是一个轻量级的 Web 框架,它基于 Golang 标准库实现,提供了路由、中间件、模板引擎等功能,可以帮助开发者快速构建 Web 应用。 3. GORM ORM 框架 GORM 是一个基于 Golang 的 ORM 框架,它提供了丰富的查询 API 和关系映射功能,可以让开发者更加方便地操作数据库。 4. Redis 数据库 Redis 是一个高性能的内存键值数据库,它支持多种数据结构和丰富的操作命令,可以用于缓存、消息队列等场景。 5. Docker 容器化技术 Docker 是一种流行的容器化技术,它可以将应用程序及其依赖打包成容器镜像,并在不同的环境中快速部署和运行。 6. Kubernetes 容器编排平台 Kubernetes 是一种开源的容器编排平台,它可以自动化地管理和调度多个容器实例,支持容器的弹性伸缩、容错等功能,可以大大简化应用程序的部署和运维工作。 7. Grafana 监控工具 Grafana 是一个流行的开源监控工具,它支持多种数据源和图表展示方式,可以帮助开发者实时监控应用程序的运行状态,快速发现和解决问题。 以上是一个基于 Golang开发技术案例,可以用于构建高性能、可靠的后端服务,并实现容器化部署和自动化运维。 ### 回答2: Golang开发技术是指用于开发Golang应用程序的技术工具集合。在Golang开发中,常用的技术包括以下几个方面: 1. Golang语言Golang是一种开源的编程语言,具有高效、简洁、并发性强等特点。通过使用Golang语言进行开发,可以快速构建高性能的应用程序。 2. Gin框架:Gin是一个轻量级的Web框架,适用于快速开发RESTful API。借助Gin框架,可以方便地创建路由、中间件,处理HTTP请求和响应等。 3. GORM:GORM是Golang中的ORM(对象关系映射)库,用于处理应用程序与数据库之间的数据映射关系。它提供了简单的API,使得开发者可以通过代码对象操作数据库,而不需要直接编写SQL语句。 4. Redis:Redis是一种开源的内存数据库,用于缓存和存储应用程序的数据。在Golang开发中,可以使用Redis作为缓存层,提高应用程序的性能和响应速度。 5. MySQL:MySQL是一种广泛使用的关系型数据库,用于存储和管理应用程序的数据。Golang开发技术中,可以使用MySQL作为主要的持久化存储层。 6. Docker:Docker是一种容器化平台,用于快速部署和管理应用程序。通过使用Docker,可以将应用程序及其依赖的环境打包成容器,并在不同的环境中快速部署和运行。 通过使用以上的Golang开发技术,可以快速构建高性能、可扩展和易维护的应用程序。其中,Golang语言提供了高效的编程能力,而Gin框架、GORM、Redis、MySQL和Docker等技术工具则提供了丰富的功能和支持,使得开发者可以更加便捷地进行开发工作。 ### 回答3: Golang是一种快速、高效、并发、可靠的编程语言,它非常适合用于构建大规模、高并发的网络服务。下面是一个关于Golang开发技术的案例: 我们公司在构建一个在线购物平台,决定采用Golang作为我们的开发技术。以下是我们的技术架构。 1. Web框架:我们选择使用Gin框架作为我们的后端服务框架。Gin是一个轻量级、高性能的Web框架,具有快速路由和中间件支持,能够帮助我们快速地搭建起我们的后端服务。 2. 数据库:我们使用MySQL作为我们的主要数据库存储引擎。Golang提供了许多MySQL的驱动程序,我们选择了go-sql-driver/mysql作为我们的数据库驱动。 3. 缓存:我们使用Redis作为我们的缓存服务。Golang提供了一些很好的Redis客户端库,我们选择了go-redis作为我们的Redis客户端库。 4. 消息队列:我们使用RabbitMQ作为我们的消息队列服务,用于处理我们的高并发消息传递需求。Golang提供了一些很好的RabbitMQ客户端库,我们选择了streadway/amqp作为我们的RabbitMQ客户端库。 5. 身份验证和授权:我们使用JWT(JSON Web Token)作为我们的身份验证和授权机制。Golang提供了一些很好的JWT库,我们选择了dgrijalva/jwt-go作为我们的JWT库。 这个技术使得我们能够高效、快速地构建起一个高并发、可靠的在线购物平台。Golang简洁的语法、高效的并发模型以及丰富的开发库,使我们的开发工作变得更加便捷和高效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值