当 Go 返回多个值时到底发生了什么

2024-01-14

Go 函数和方法可以返回多个值。

func learnMultiple(x, y int) (sum, prod int) {
    return x + y, x * y // return two values
}

总和, 产品 := learnMultiple(10, 50)

是不是和返回一个元组类似?

我来自红宝石之地,在那里我可以返回一个数组和一个

sum, prod = ["60","500"]

我们可以轻松地查看一些编译的代码来确认幕后发生的事情。

考虑这个片段:

func f() (a, b byte) {
    return 'x', 'y'
}

func main() {
    a, b := f()
    println(a, b)
}

如果我们反汇编创建的 ELF 二进制文件,您将看到类似这样的内容(内联已禁用,因此我们可以看到调用发生):

0000000000400c00 <main.f>:
400c00:       c6 44 24 08 78          movb   $0x78,0x8(%rsp)
400c05:       c6 44 24 09 79          movb   $0x79,0x9(%rsp)
400c0a:       c3                      retq

0000000000400c10 <main.main>:
(...)
400c25:       48 83 ec 10             sub    $0x10,%rsp
400c29:       e8 d2 ff ff ff          callq  400c00 <main.f>
400c2e:       48 0f b6 1c 24          movzbq (%rsp),%rbx
400c33:       48 89 d8                mov    %rbx,%rax
400c36:       48 0f b6 5c 24 01       movzbq 0x1(%rsp),%rbx
(...)

So f只是将结果字节放入堆栈中,并且main将它们取回并将它们放入工作寄存器中。不同的编译器也可能选择将两个作用域之间的这些值直接传递到寄存器中。

这与 C 语言编译器的操作类似,只是其规范仅定义了单个返回值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当 Go 返回多个值时到底发生了什么 的相关文章

随机推荐

  • 如何避免重复常见的可观察配置?

    我正在使用 Retrofit 在 Android 中编写一个 API 客户端 这种代 码会重复很多次 myObservableFromRetrofit subscribeOn Schedulers io observeOn AndroidS
  • 如何将RequestMappingHandlerMapping和资源处理程序添加到Spring MVC配置类

    我有一个像这样的 Spring MVC 配置类 Configuration EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter Bean public In
  • Flutter:我可以将参数传递给按钮上 onPress 事件中定义的函数吗?

    我有一个简单的表单 带有一个用于计算表单的按钮 我认为最好点击按钮开始计算操作并将变量传递给哑函数 而不是让函数知道它不需要知道的文本字段 我可以这样做吗 或者我的计算函数是否需要访问我的文本字段 new Container color C
  • 使用 JavaScript 滚动时响应式动画页面元素 [编辑:视差滚动]

    我确信这个问题过去曾被提起过 然而我对一个术语不知所措 On this web page https squareup com careers creative对于 square 用户滚动浏览标题为 在 Square 不同学科协作设计精美简
  • ImageFont.textsize()返回值的单位是什么?

    我正在尝试使用 PIL 来预先计算给定文本行在给定字体和大小下所采用的大小 PIL 似乎或多或少是唯一可行的解 决方案 我不确定返回值的单位是什么font textsize The doc http effbot org imagingbo
  • 在绘图和小平面条之间移动轴标签

    我试图将小面条移动到图的最左侧 以便标签位于条形旁边 分组条位于其左侧 请参见下面的示例 我认为这必须通过 Grob 来完成 但我对这种级别的操作缺乏经验 并且希望得到指导 Data structure list dept structur
  • 如何在存储过程中迭代记录集?

    我需要从存储过程迭代记录集 并使用每个字段作为参数执行另一个存储过程 我无法在代码中完成此迭代 我在互联网上找到了示例 但它们似乎都涉及计数器 我不确定我的问题是否涉及计数器 我需要相当于 T SQL 的foreach 目前 我的第一个存储
  • 如何使用多行字符串示例比较 Cucumber 步骤中的 xml 输出?

    Chargify 在他们的项目中有这个 Cucumber 场景docs http docs chargify com api customers api usage xml customers read Scenario Retrieve
  • 想要在按我的应用程序的启动器图标后返回到上一个活动

    假设我有一个活动 A 启动活动 B 并自行终止 现在 我按下主页按钮 或以其他方式离开应用程序 导致活动 B 的 onPause gt onStop 然后再次单击启动器中的应用程序图标 所发生的情况是 活动 A 再次启动 当然是因为我在清单
  • 使用 C# 替换本机 .exe 中的字符串

    如何捕获本机 Windows exe 文件中的所有字符串 并稍后使用 C 将它们替换为其他字符串 背景 我想创建一个 C 工具来从简单的 exe 文件中提取和替换字符串 这有可能吗 您需要启动一个 PE COFF 解析器 如果你的字符串存储
  • 使用sql从多个字段中选择不同的字段

    我有 5 列对应于问答游戏数据库中的答案 对 错 1 错 2 错 3 错 4 我想返回所有可能的答案而不重复 我希望在不使用临时表的情况下完成此任务 是否可以使用类似的东西 select c1 c2 count from t group b
  • 受保护的成员/字段真的那么糟糕吗?

    现在 如果您阅读 MSDN 中 C 的命名约定 您会注意到它指出属性始终优先于公共字段和受保护字段 有些人甚至告诉我 你永远不应该使用公共或受保护的领域 现在我同意我还没有找到需要拥有公共领域的理由 但受保护的领域真的那么糟糕吗 如果您需要
  • 原始变量和引用变量的内存分配[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions type name 对于引用类型 这
  • Java:返回 java.util.Date 格式的字符串[重复]

    这个问题在这里已经有答案了 我将以 201201 格式接收输入 即 YYYYMM 格式 现在我想按原样返回值 201201 但它应该采用 java util Date 格式 我很困惑 String strDate 201201 Simple
  • Hadoop 溢出故障

    我目前正在开发一个使用 Hadoop 0 21 0 985326 以及一个由 6 个工作节点和一个头节点组成的集群的项目 提交常规 MapReduce 作业失败 但我不知道为什么 以前有人见过这个异常吗 org apache hadoop
  • MS-SQL 查询 - 更新通过存储过程检索的记录

    UPDATE 现在范围已经稍微扩大了 我现在需要检索字段 Id uri linkTo 这如何改变事情 我正在使用 MS SQL 2005 数据库并具有以下存储过程 CREATE PROCEDURE dbo getNewAds region
  • 将数据发送到单独的窗口 javascript

    我使用以下命令从现有页面创建了一个新的弹出窗口 window open myUrl myName width 200 height 200 现在 在该弹出窗口上 我有一个文本输入和一个按钮 我想为按钮创建一个 onclick 方法 将文本输
  • 三星 G5 setvisibility 出现空指针异常

    Android 应用代码可在各种设备上成功运行 包括早至 API 14 至 API 19 目标 但是 Samsung G5 v4 4 4 在尝试为活动设置 Visibilty true 时会抛出 NPE 此错误可能仅在最近通过 Sprint
  • 编组通知包

    我正在尝试将通知对象写入文件 我能找到的最好方法是将对象写入包 编组该包以获取字节 然后将其写入文件 Parcel notif Parcel obtain notification writeToParcel notif 0 byte no
  • 当 Go 返回多个值时到底发生了什么

    Go 函数和方法可以返回多个值 func learnMultiple x y int sum prod int return x y x y return two values 总和 产品 learnMultiple 10 50 是不是和返