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

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

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

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

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

在这里插入图片描述

package main

func 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=0x0
        TEXT    main.main(SB), ABIInternal, $104-0
        CMPQ    SP, 16(R14)
        PCDATA  $0, $-2
        JLS     154
        PCDATA  $0, $-1
        SUBQ    $104, SP
        MOVQ    BP, 96(SP)
        LEAQ    96(SP), BP
        FUNCDATA        $0, gclocals·g2BeySu+wFnoycgXfElmcg==(SB)
        FUNCDATA        $1, gclocals·g2BeySu+wFnoycgXfElmcg==(SB)
        MOVL    $1, AX
        MOVL    $10, BX
        MOVL    $100, CX
        PCDATA  $1, $0
        CALL    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), AX
        CALL    runtime.printint(SB)
        CALL    runtime.printsp(SB)
        MOVQ    main.y+32(SP), AX
        CALL    runtime.printint(SB)
        CALL    runtime.printsp(SB)
        MOVQ    main.z+24(SP), AX
        CALL    runtime.printint(SB)
        CALL    runtime.printnl(SB)
        CALL    runtime.printunlock(SB)
        MOVQ    96(SP), BP
        ADDQ    $104, SP
        RET
        NOP
        PCDATA  $1, $-1
        PCDATA  $0, $-2
        CALL    runtime.morestack_noctxt(SB)
        PCDATA  $0, $-1
        NOP
        JMP     0
        
main.function STEXT nosplit size=118 args=0x18 locals=0x20 funcid=0x0 align=0x0
        TEXT    main.function(SB), NOSPLIT|ABIInternal, $32-24
        SUBQ    $32, SP
        MOVQ    BP, 24(SP)
        LEAQ    24(SP), BP
        FUNCDATA        $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), AX
        INCQ    AX
        MOVQ    AX, main.a+40(SP)
        MOVQ    main.b+48(SP), BX
        INCQ    BX
        MOVQ    BX, main.b+48(SP)
        MOVQ    main.c+56(SP), CX
        INCQ    CX
        MOVQ    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), BP
        ADDQ    $32, SP
        RET
        

相关推荐

  1. golang函数返回

    2024-06-08 20:02:03       43 阅读
  2. C#返回方法

    2024-06-08 20:02:03       8 阅读
  3. 拼接两异步函数返回

    2024-06-08 20:02:03       12 阅读
  4. oceanBase存储返回

    2024-06-08 20:02:03       38 阅读
  5. WPF中将函数返回分别绑定至界面控件

    2024-06-08 20:02:03       14 阅读
  6. Spring MVC 返回哪些

    2024-06-08 20:02:03       17 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-08 20:02:03       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-08 20:02:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-08 20:02:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-08 20:02:03       20 阅读

热门阅读

  1. 360数字安全:2024年1月勒索软件流行态势分析报告

    2024-06-08 20:02:03       11 阅读
  2. 【名词解释】Unity中的Toggle组件及其使用示例

    2024-06-08 20:02:03       8 阅读
  3. mac m1使用docker安装mysql5.7,并且开启binlog

    2024-06-08 20:02:03       10 阅读
  4. 代码随想录35期总结

    2024-06-08 20:02:03       12 阅读
  5. break、continue、return

    2024-06-08 20:02:03       12 阅读
  6. nginx location正则表达式+案例解析

    2024-06-08 20:02:03       13 阅读
  7. 设计模式-外观模式

    2024-06-08 20:02:03       9 阅读
  8. mysql怎么部署双机

    2024-06-08 20:02:03       8 阅读
  9. Percona XtraBackup备份用户需要的最小权限(mysql)

    2024-06-08 20:02:03       12 阅读
  10. 基于网格的CLIQUE聚类算法的实现

    2024-06-08 20:02:03       10 阅读