当前位置: 首页 > 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
http://www.lryc.cn/news/365469.html

相关文章:

  • 一次 K8s 故障诊断:从 CPU 高负载到存储挂载泄露根源揭示
  • python大作业:实现的简易股票简易系统(含源码、说明和运行截图)
  • python-NLP常用数据集0.1.012
  • 【大事件】docker可能无法使用了
  • 探索Linux中的gzip命令:压缩与解压缩的艺术
  • Shell 输入/输出重定向
  • 为什么RPC要比Http高效?
  • 局域网电脑监控软件是如何监控到内网电脑的?
  • 精妙无比的App UI 风格
  • SQL优化系列-快速学会分析SQL执行效率(下)
  • 交流非线性RCD负载的核心功能
  • 英语学习笔记31——Where‘s Sally?
  • 【Unity脚本】使用脚本操作游戏对象的组件
  • 学习VUE3——组件(一)
  • 2024-6-6 石群电路-25
  • vue 文件预览mp4、txt、pptx、xls、xlsx、docx、pdf、html、xml
  • 生活中优秀学习习惯
  • 什么是负载均衡?在网络中如何实现?
  • 【YOLOv10改进[Backbone]】图像修复网络AirNet助力YOLOv10目标检测效果 + 含全部代码和详细修改方式 + 手撕结构图 + 全网首发
  • ubuntu22.04 gitleb服务器满了,扩容机器的磁盘的详细步骤
  • kafka-集群-主题创建
  • Python 连接 MySQL 及 SQL增删改查(主要使用sqlalchemy)
  • JAVAEE值网络编程(2)_TCP流套接字及通信模型、TCP网络编程及代码实例
  • 【MMU】——MMU 页命中/缺页
  • Win32和c++11多线程
  • 关于python包导入问题的重思考
  • 攻防世界---misc---津门杯2021-m1
  • 【计算机视觉(8)】
  • Linux操作系统:Redis在虚拟环境下的安装与部署
  • 哈希表和二维矩阵的结合-2352. 相等行列对(新思路、新解法)