Ich wünschte, ich so etwas wie der folgende Code mit golang tun könnte:Golang goroutine kann nicht Funktion Rückgabewert (e) verwenden
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!")
}
Genauer gesagt, ich wünsche Go Gleichzeitigkeit hinter der Szene umgehen konnte.
Das könnte ein bisschen off topic sein, aber ich bin gespannt, was Leute denken, solche implizite Nebenläufigkeit Unterstützung zu haben. Lohnt es sich, etwas dafür zu tun? und was sind die möglichen Schwierigkeiten und Nachteile?
Edit:
Um klar zu sein, die Frage ist nicht über „? Was Go ist jetzt zu tun“, und nicht einmal „? Wie es umgesetzt wird“ obwohl ich @icza Post zu schätzen weiß, was genau wir von Go erwarten sollten, wie es jetzt ist. Die Frage ist, warum es keine Werte zurückgeben kann oder nicht, und welche potenziellen Komplikationen ergeben sich daraus?
Zurück zu meinem einfaches Beispiel:
A := go getA()
B := go getB()
C := A + B // waits till getA() and getB() return
Ich sehe keine Probleme, den Umfang der Variablen in Bezug auf zumindest aus der Syntax Sicht. Der Gültigkeitsbereich von A
, B
und C
wird klar durch den Block definiert, in dem sie sich befinden (in meinem Beispiel ist der Bereich die main()
-Funktion). Eine vielleicht berechtigtere Frage wäre jedoch, ob diese Variablen (hier A
und B
) "bereit" zum Lesen sind? Natürlich sollten sie nicht bereit und zugänglich sein, bis und getB()
fertig sind. Genau das ist alles, wonach ich fragen möchte: Der Compiler könnte alle Glocken und Pfeifen hinter der Szene implementieren, um sicherzustellen, dass die Ausführung blockiert wird, bis A
und B
bereit sind zu konsumieren (anstatt den Programmierer zu zwingen, diese Wartezeiten explizit zu implementieren) und pfeift mit Kanälen).
Dies könnte die gleichzeitige Programmierung viel einfacher machen, insbesondere für Fälle, in denen Rechenaufgaben voneinander unabhängig sind. Die Kanäle könnten weiterhin für eine explizite Kommunikation und Synchronisation verwendet werden, falls dies wirklich benötigt wird.
Related: [Was passiert mit Wert von goroutine zurückgeben] (http://stackoverflow.com/questions/27868369/what-happens-to-return-value-from-goriginute) – icza
Dies hinter der Szene ist zu viel Abstraktion. Goroutines sind verschiedene laufende Prozesse oder Threads, und soweit ich weiß, gibt es keine Möglichkeit (oder zumindest nicht empfohlen), Ergebnisse von zwei Prozessen oder Threads zu verbinden, ohne explizit den Join aufzurufen und den Wert abzurufen. – PieOhPah