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

从goroutine捕获返回值

葛飞扬
2023-03-14
问题内容

以下代码给出了编译错误,提示“意外运行”:

x := go doSomething(arg)

func doSomething(arg int) int{
    ...
    return my_int_value
}

我知道,如果正常调用函数就可以获取返回值,而无需使用goroutine。或者我可以使用频道等

我的问题是为什么不能从goroutine中获取像这样的返回值。


问题答案:

严格的答案是您 可以 做到。这可能不是一个好主意。下面的代码可以做到这一点:

var x int
go func() {
    x = doSomething()
}()

这将产生一个新的goroutine,它将进行计算doSomething(),然后将结果分配给x。问题是:您将如何使用x原始goroutine?您可能要确保使用它完成了生成的goroutine,以便您没有竞争条件。但是,如果要执行此操作,则需要一种与goroutine进行通信的方法,并且如果可以执行此操作,为什么不仅仅使用它来将值发送回去呢?



 类似资料:
  • 我想要能够让我的catch请求用户输入文件名,直到文件名有效为止,有没有人能给我一个建议,如何安排我的代码做到这一点? 导入java.io.FileNotFoundException;导入java.util.scanner; public class Requierment2{public static void main(String[]args){ }

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

  • 我有一个返回< code>List的方法。现在我想知道如何正确放置< code>try/catch块。如果我将< code>return语句放在< code>try中,我会得到错误 并非所有代码路径都返回值 如果我放置在之后(就像我目前所做的那样),即使在之后,它也会返回。那么最好的方法应该是什么? 方法如下:

  • 我使用的是交互式代理的ibapi,我通常被困在如何捕获返回的数据上。例如,根据api文档,当我请求reqAccountSummary()时,该方法通过accountSummary()传递数据。但他们的例子只打印数据。我曾尝试捕获数据或将其分配给变量,但他们的文档中没有任何地方显示如何执行此操作。我也在谷歌搜索,只找到register()和registerAll(),但这是来自ib.opt的,它不在

  • 问题内容: 我在Go中有一个返回两个值的函数。我想将其作为goroutine运行,但是我无法弄清楚创建接收两个值的通道的语法。有人能指出我正确的方向吗? 问题答案: 使用两个值的字段定义自定义类型,然后创建该类型的。 编辑:我还添加了一个使用多个通道而不是自定义类型的示例(在底部)。我不确定哪个更惯用。 例如: 然后 使用自定义类型的频道(Playground)的示例: 产生: LOREM,5 I

  • 有许多关于如何在使用JavaScript Promise编程时使用“然后”和“捕获”的教程。然而,所有这些教程似乎都忽略了一个重要的点:从然后/捕获块返回以打破promise链。让我们从一些同步代码开始来说明这个问题: 本质上,我正在测试一个捕获的错误,如果不是我期望的错误,我会返回给调用方,否则程序将继续。然而,这种逻辑在Promise中不起作用: 这种逻辑用于我的一些单元测试,我希望函数以某种