2016-10-21 2 views
0

У меня есть служебная функция в Голанге, где работает бесконечный цикл. Я хотел получить данные из этой функции без возврата. Какое наилучшее решение, канал или io.Writer? Функция и где я называю ее в другом пакете, потому что funcion в package something, в то время как я называю это основным. Существует пример с каналами:Получение ответа от функции без возврата - Golang

func Check(dst string, w chan string) bool {  
    for { 
    w <- data 
    } 
    return false 
} 

На Otherside, где я называю эту функцию:

var wg sync.WaitGroup 
func main() { 
    messages := make(chan string, 10) 

    wg.Add(3) 
    go checking("10.1.1.1", messages) 
    msg := <-messages 
    fmt.Println(msg) 
    wg.Wait() 
} 

func checking(ip string, msg chan string) { 
    defer wg.Done() 
    w := worker.ContainerAliveIndicator{} 
    w.Check(ip, msg) 
} 

В этом случае я получаю только первое сообщение, что функция принимать к каналу.

ответ

1

Канал является хорошим вариантом. Для того, чтобы прочитать все сообщения, только для чтения из канала в цикле, пока она не закроется:

func check(s string, ch chan<- string) { 
    for i := 0; i < 5; i++ { 
     //this could go forever, or until some condition is met 
     ch <- fmt.Sprintf("I did something %s %d", s, i) 
     time.Sleep(time.Millisecond) 
    } 
    close(ch) 
} 

func main() { 
    ch := make(chan string) 
    go check("FOO", ch) 
    for msg := range ch { //will break when ch closes 
     fmt.Println(msg) 
    } 
    fmt.Println("DONE!") 
} 

playground

Другой вариант прохождения обратного вызова в функцию:

func check(s string, cb func(string)) { 
    for i := 0; i < 5; i++ { 
     //this could go forever, or until some condition is met 
     cb(fmt.Sprintf("I did something %s %d", s, i)) 
     time.Sleep(time.Millisecond) 
    } 
} 

func main() { 
    msgs := []string{} 
    check("FOO", func(s string) { msgs = append(msgs, s) }) 
    fmt.Println(msgs) 
} 

playground

+0

Удивительного , первый с каналами хорош. Спасибо. – PumpkinSeed

Смежные вопросы