我希望我能使用golang编写以下类似代码:
package main
import (
"fmt"
"time"
)
func getA() (int) {
fmt.Println("getA: Calculating...")
time.Sleep(300 * time.Millisecond)
fmt.Println("getA: Done!")
return 100
}
func getB() (int) {
fmt.Println("getB: Calculating...")
time.Sleep(400 * time.Millisecond)
fmt.Println("getB: Done!")
return 200
}
func main() {
A := go getA()
B := go getB()
C := A + B // waits till getA() and getB() return
fmt.Println("Result:", C)
fmt.Println("All done!")
}
更具体地说,我希望Go能够在幕后处理并发性。
这可能有点离题,但我很好奇人们对于拥有这种隐式并发支持的想法持有何种看法。值得花费一些努力吗?有哪些潜在的困难和缺点?
编辑:
明确一下,问题不是关于"Go现在正在做什么?",甚至不是关于"它是如何实现的?",尽管我欣赏@icza在我们应该从Go中期望什么方面的帖子。问题是为什么它不会或不能返回值,以及这样做可能存在的复杂性是什么?
回到我的简单例子:
A := go getA()
B := go getB()
C := A + B // waits till getA() and getB() return
我认为从语法角度来看,变量作用域没有任何问题。在我的例子中,
A
、B
和C
的作用域由它们所处的块(在这里是main()
函数)清晰地定义。然而,一个更合理的问题可能是这些变量(在这里是A
和B
)是否“准备好”被读取了?当然,在getA()
和getB()
完成之前,它们不应该准备好或者可访问。实际上,这就是我想要的:编译器可以在幕后实现所有必要的细节,以确保执行将被阻塞,直到A
和B
准备好消耗(而不是强制程序员使用通道显式地实现这些等待和细节)。这可以使并发编程变得更加简单,特别是对于彼此独立的计算任务的情况。如果真的需要,仍然可以使用通道进行显式通信和同步。