2017-08-15 127 views
0

在下面的代码中,如何将结果从slowExternalFunction分配给合适的?它可以通过渠道完成,只是为了清晰起见,我定义了slowExternalFunction返回int将goroutine的结果传递给循环内的变量

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

回答

0

要使用你得渠道重构你的代码颇有几分做到这一点。

最小化是做的够程分配:

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

然而,为了使这项工作,我们就需要做出一些其他变更:

  • 使用数组的指针,以便您可以在作业完成前添加该人员。
  • 实现一个等待组,以便在打印结果之前等待所有的goroutine完成。

以下是完整main函数的变化:

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) 
    } 
} 

游乐场:https://play.golang.org/p/8GWYD29inC

相关问题