2016-10-21 16 views
0

Golangには無限のforループを実行するサービス関数があります。私はこの関数から戻り値なしでデータを取得したかったのです。最高のソリューション、チャネル、またはio.Writerは何ですか?私がそれを呼び出す部分はpackage somethingの関数であるので、私は別のパッケージで関数と呼びます。私はこの関数を呼び出しothersideで戻り値なし関数からの応答の取得 - Golang

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

:この場合

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

関連する問題