2016-10-21 6 views
0

나는 Golang에서 끝없는 for 루프를 실행하는 서비스 기능을 가지고 있습니다. 이 함수의 데이터를 반환하지 않고 싶었습니다. 가장 좋은 솔루션, 채널 또는 io.Writer는 무엇입니까? 함수와 내가 다른 패키지에서 호출하는 곳, 왜냐하면 funcion이 package something에 있기 때문에 나는 그것을 main이라고 부른다. 나는이 함수를 호출 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