当前位置: 首页 > 面试题库 >

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

单于钊
2023-03-14
问题内容

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

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

总和,prod:= learningMultiple(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
(...)

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

除了其规范仅定义单个返回值外,这都与C语言编译器的工作类似。



 类似资料:
  • Go语言内置支持多返回值,这个在Go语言中用的很多,比如一个函数同时返回结果和错误信息。 package main import "fmt" // 这个函数的返回值为两个int func vals() (int, int) { return 3, 7 } func main() { // 获取函数的两个返回值 a, b := vals() fmt.Println(a

  • 问题内容: 有人可以提供goroutine返回的澄清值。从goroutine返回的值是否已存入抵押。 例如: 我们是否应该避免在go例程中避免返回值? 问题答案: 快速查看一下组装输出显示 该函数确实将其结果存储到堆栈中 因此,当从goroutine调用它时,它会将结果存储到堆栈中。但是,这是一个新的堆栈,当goroutine结束时,该堆栈会被破坏,因此无法获取返回值。 但是,无法检索这些结果。

  • 问题内容: 好的,有没有一种方法可以从函数中返回值-该方法可以-但不能 停止 该函数-该方法可以呢? 我需要这个,所以我可以经常返回值。(由或其他方式提供的延迟。) 问题答案: 我想你在找。例:

  • 问题内容: 我的查询导致以下错误: 消息512,级别16,状态1,过程Item_insupd,第17行 子查询返回了多个值。当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。 询问: 我怀疑这种情况的发生是因为我的子查询不包含,但是不幸的是,我不知道如何构造正确的子句。 问题答案: 我怀疑问题出在此字符串中(您的代码中的第26行): 看起来像返回多个行,所以您遇到了错

  • 问题内容: 可以在Python中创建无限的嵌套列表。这很明显,尽管不受欢迎并且绝对没有用,但这是一个已知事实。 我的问题是,这里发生了什么: 当我试图理解它时,会更深入地了解我,就像我的大脑将要爆炸一样。我看到,a包含b,其中包含a依此类推… 现在我对这个问题提出疑问。我们这里真的有两个列表,还是只有一个?这样的事情如何存储在内存中?使程序员实现如此奇怪的目标的目的可能是什么? 拜托,不要把这个问

  • 问题内容: 我有标签: 后面的代码: 和: 如何返回多个值?该标签仅显示单个值,但表中还有6个值。 问题答案: 试试这个: 当然,这 只是 一个示例,并不能完全解决您的问题,但是应该作为一个起点:)