2017-08-15 1 views
0

Mit dem folgenden Code, wie ein Ergebnis von slowExternalFunction zu einem richtigen Person zuweisen? Es kann über Kanäle erfolgen und nur für die Klarheit habe ich definiert, dass slowExternalFunctionint zurückgibt.Übergeben Sie ein Ergebnis von goroutine an eine Variable innerhalb der Schleife

type Person struct { 
    Id  int 
    Name  string 
    WillDieAt int 
} 

func slowExternalAPI(i int) int { 
    time.Sleep(10) 
    willDieAt := i + 2040 
    return willDieAt 
} 

func fastInternalFunction(i int) string { 
    time.Sleep(1) 
    return fmt.Sprintf("Ivan %v", i) 
} 

func main() { 
    var persons []Person 

    for i := 0; i <= 100; i++ { 
     var person Person 
     person.Id = i 
     person.Name = fastInternalFunction(i) 
     go slowExternalAPI(i) 
     person.WillDieAt = 2050 //should be willDieAt from the slowExternalAPI 
     persons = append(persons, person) 
    } 
    fmt.Printf("%v", persons) 
} 

https://play.golang.org/p/BRBgtH5ryo

Antwort

0

es tun Kanäle Sie Ihren Code ziemlich viel Refactoring müssen.

Kleinste Änderung wäre die Zuordnung im goroutine zu tun:

go func(){ 
    person.WillDieAt = slowExternalFunction(i) 
}() 

Doch diese Arbeit machen wir auch einige andere Änderungen vornehmen müssen würde zu:

  • ein Array verwenden von Zeigern, so dass Sie die Person hinzufügen können, bevor der Auftrag abgeschlossen ist.
  • Implementieren Sie eine Warteliste, sodass Sie warten, bis alle Ermittlungen beendet sind, bevor Sie die Ergebnisse drucken.

ist die komplette main Funktion mit den Änderungen:

func main() { 
    var persons []*Person 
    var wg sync.WaitGroup 

    for i := 0; i <= 100; i++{ 
     person := &Person{} 
     person.Id = i 
     person.Name = fastInternalFunction(i) 
     wg.Add(1) 
     go func(){ 
      person.WillDieAt = slowExternalFunction(i) 
      wg.Done() 
     }() 

     persons = append(persons,person) 
    } 
    wg.Wait() 
    for _, person := range persons { 
     fmt.Printf("%v ", person) 
    } 
} 

Spielplatz: https://play.golang.org/p/8GWYD29inC

Verwandte Themen