当前位置: 首页 > news >正文

golang的函数为什么能有多个返回值?

在golang1.17之前,函数的参数和返回值都是放在函数栈里面的,比如函数A调用函数B,那么B的实参和返回值都是存放在函数A的栈里面,所以可以轻松的返回多个值。

其他的编程语言大都使用某个寄存器来存储函数的返回值。

但是从golang1.17开始,还是换成了使用寄存器来存储函数的参数和返回值,如果有多个返回值则依次使用AX, BX, CX, DX, SI, DI等寄存器来存储,这样可以稍微提升一些性能。

https://golang.google.cn/doc/go1.17

在这里插入图片描述

package mainfunc main() {x, y, z := function(1, 10, 100)println(x, y, z)
}func function(a, b, c int64) (int64, int64, int64) {a++b++c++return a, b, c
}

go tool compile -S -N -l cat.go

main.main STEXT size=165 args=0x0 locals=0x68 funcid=0x0 align=0x0TEXT    main.main(SB), ABIInternal, $104-0CMPQ    SP, 16(R14)PCDATA  $0, $-2JLS     154PCDATA  $0, $-1SUBQ    $104, SPMOVQ    BP, 96(SP)LEAQ    96(SP), BPFUNCDATA        $0, gclocals·g2BeySu+wFnoycgXfElmcg==(SB)FUNCDATA        $1, gclocals·g2BeySu+wFnoycgXfElmcg==(SB)MOVL    $1, AXMOVL    $10, BXMOVL    $100, CXPCDATA  $1, $0CALL    main.function(SB)MOVQ    AX, main..autotmp_6+64(SP)MOVQ    BX, main..autotmp_7+56(SP)MOVQ    CX, main..autotmp_8+48(SP)MOVQ    AX, main..autotmp_3+88(SP)MOVQ    BX, main..autotmp_4+80(SP)MOVQ    CX, main..autotmp_5+72(SP)MOVQ    AX, main.x+40(SP)MOVQ    BX, main.y+32(SP)MOVQ    CX, main.z+24(SP)CALL    runtime.printlock(SB)MOVQ    main.x+40(SP), AXCALL    runtime.printint(SB)CALL    runtime.printsp(SB)MOVQ    main.y+32(SP), AXCALL    runtime.printint(SB)CALL    runtime.printsp(SB)MOVQ    main.z+24(SP), AXCALL    runtime.printint(SB)CALL    runtime.printnl(SB)CALL    runtime.printunlock(SB)MOVQ    96(SP), BPADDQ    $104, SPRETNOPPCDATA  $1, $-1PCDATA  $0, $-2CALL    runtime.morestack_noctxt(SB)PCDATA  $0, $-1NOPJMP     0main.function STEXT nosplit size=118 args=0x18 locals=0x20 funcid=0x0 align=0x0TEXT    main.function(SB), NOSPLIT|ABIInternal, $32-24SUBQ    $32, SPMOVQ    BP, 24(SP)LEAQ    24(SP), BPFUNCDATA        $0, gclocals·g2BeySu+wFnoycgXfElmcg==(SB)FUNCDATA        $1, gclocals·g2BeySu+wFnoycgXfElmcg==(SB)FUNCDATA        $5, main.function.arginfo1(SB)MOVQ    AX, main.a+40(SP)MOVQ    BX, main.b+48(SP)MOVQ    CX, main.c+56(SP)MOVQ    $0, main.~r0+16(SP)MOVQ    $0, main.~r1+8(SP)MOVQ    $0, main.~r2(SP)MOVQ    main.a+40(SP), AXINCQ    AXMOVQ    AX, main.a+40(SP)MOVQ    main.b+48(SP), BXINCQ    BXMOVQ    BX, main.b+48(SP)MOVQ    main.c+56(SP), CXINCQ    CXMOVQ    CX, main.c+56(SP)MOVQ    AX, main.~r0+16(SP)MOVQ    BX, main.~r1+8(SP)MOVQ    CX, main.~r2(SP)MOVQ    24(SP), BPADDQ    $32, SPRET

相关文章:

golang的函数为什么能有多个返回值?

在golang1.17之前,函数的参数和返回值都是放在函数栈里面的,比如函数A调用函数B,那么B的实参和返回值都是存放在函数A的栈里面,所以可以轻松的返回多个值。 其他的编程语言大都使用某个寄存器来存储函数的返回值。 但是从golang…...

一次 K8s 故障诊断:从 CPU 高负载到存储挂载泄露根源揭示

一、背景 现代软件部署中,容器技术已成为不可或缺的一环,在云计算和微服务架构中发挥着核心作用。随着容器化应用的普及,确保容器环境的可靠性成为了一个至关重要的任务。这就是容器SRE(Site Reliability Engineering&#xff0c…...

python大作业:实现的简易股票简易系统(含源码、说明和运行截图)

实现一个简单的股票交易模拟系统。该系统将包括以下几个部分: 数据处理:从CSV文件中读取股票数据。 股票交易算法:实现一个简单的交易策略。 命令行界面(CLI):允许用户查看股票数据和进行交易。 数据持久化:将用户的交易记录和当前资金存储在数据库中。 为了简化这个示例…...

python-NLP常用数据集0.1.012

XNLI数据集 用户语言翻译和跨语言分类的语料库 官网地址:https://github.com/facebookresearch/XNLI下载地址:https://dl.fbaipublicfiles.com/XNLI/XNLI-1.0.zip注意事项:数据集有json格式的,和txt格式的数据格式 txt格式 la…...

【大事件】docker可能无法使用了

今天本想继续学习docker的命令,突然发现官方网站的文档页面打不开了。 难道是被墙了? 我用同事的翻了一下,能进,果然! 正好手头的工作告一段落,将代码上传,然后通过jenkins将服务器自动部署到…...

探索Linux中的gzip命令:压缩与解压缩的艺术

探索Linux中的gzip命令:压缩与解压缩的艺术 在Linux世界中,文件压缩和解压缩是日常任务中不可或缺的一部分。gzip命令是这些任务中的佼佼者,它提供了高效的压缩和解压缩功能,广泛应用于各种场景。本文将带您深入了解gzip命令的工…...

Shell 输入/输出重定向

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝&#x1f49…...

为什么RPC要比Http高效?

RPC和HTTP RPC(Remote Procedure Call)基于TCP连接通常比HTTP在性能上要高很多,原因如下: 1. 协议开销 HTTP开销: HTTP协议报文头部相对较大,包含大量的元数据(如方法、URI、头字段等&#x…...

局域网电脑监控软件是如何监控到内网电脑的?

在信息化快速发展的今天,局域网电脑监控软件成为许多企业、学校和机构重要的实用工具。这些软件的主要功能在于对局域网内的电脑进行实时监控,以确保网络的安全、员工的工作效率以及合规性。那么,局域网电脑监控软件是如何做到对内网电脑进行…...

精妙无比的App UI 风格

精妙无比的App UI 风格...

SQL优化系列-快速学会分析SQL执行效率(下)

1 show profile 分析慢查询 有时需要确定 SQL 到底慢在哪个环节,此时 explain 可能不好确定。在 MySQL 数据库中,通过 profile,能够更清楚地了解 SQL 执行过程的资源使用情况,能让我们知道到底慢在哪个环节。 知识扩展&#xff1…...

交流非线性RCD负载的核心功能

非线性RCD负载是一种广泛应用于电力系统中的电子元件,主要用于保护电路免受过电压和欠电压的影响。它的核心功能主要包括以下几个方面: 1. 过电压保护:当电路中的电压超过设定值时,非线性RCD负载会自动断开电路,防止电…...

英语学习笔记31——Where‘s Sally?

Where’s Sally? Sally在哪? 词汇 Vocabulary garden /ˈɡɑːrdn/ n. 花园,院子(属于私人) 区别:park n. 公园(公共的) 例句:我的花园非常大。    My garden is very big. 搭…...

【Unity脚本】使用脚本操作游戏对象的组件

【知识链】Unity -> Unity脚本 -> 游戏对象 -> 组件 【知识链】Unity -> Unity界面 -> Inspector【摘要】本文介绍如何使用脚本添加、删除组件,以及如何访问组件 文章目录 引言第一章 游戏对象与组件1.1 什么是组件?1.2 场景、游戏对象与…...

学习VUE3——组件(一)

组件注册 分为全局注册和局部注册两种。 全局注册: 在main.js或main.ts中,使用 Vue 应用实例的 .component() 方法,让组件在当前 Vue 应用中全局可用。 import { createApp } from vue import MyComponent from ./App.vueconst app crea…...

2024-6-6 石群电路-25

2024-6-6,星期四,15:56,天气:晴,心情:晴。今天又是阳光明媚的一天打印了毕业论文,准备了一些毕业&答辩的材料,感觉离毕业越来越近了,加油学习喽~ 今日观看了石群老师…...

vue 文件预览mp4、txt、pptx、xls、xlsx、docx、pdf、html、xml

vue 文件预览 图片、mp4、txt、pptx、xls、xlsx、docx、pdf、html、xml 最近公司要做一个类似电脑文件夹的功能,支持文件夹操作,文件操作,这里就不说文件夹操作了,说说文件预览操作,本人是后端java开发,前端vue&#…...

生活中优秀学习习惯

早起: 23点睡--4至6点起床(睡足7、8个钟头),起来第一件事是工作(或学习)。不是吃早餐,不是刷牙。(空腹工作一段时间)--做推理让头脑运作,不要背书&#xff0…...

什么是负载均衡?在网络中如何实现?

负载均衡(Load Balancing)是一种网络技术,用于将网络请求或数据传输任务分发到多个服务器或处理单元上,以实现更高效的资源利用、更高的处理能力和更好的系统可靠性。负载均衡的目标是优化资源使用、最大化吞吐量、减少响应时间&a…...

【YOLOv10改进[Backbone]】图像修复网络AirNet助力YOLOv10目标检测效果 + 含全部代码和详细修改方式 + 手撕结构图 + 全网首发

本文带来的是图像复原网络AirNet,它由基于对比度的退化编码器( CBDE )和退化引导的恢复网络( DGRN )两个模块组成。可以在一个网络中恢复各种退化图像。AirNet不受损坏类型和级别的先验限制,仅使用观察到的损坏图像进行推理。本文中将使用图像修复网络AirNet助力YOLOv10的目标…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键&#xff…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...