2016-10-30 4 views
-3

안녕하세요. 루틴과 채널에 대해 알아 봅니다. 채널을 통해 실험 해보고, 채널을 통해 데이터를 보내고 2 가지 기능을 사용하려고합니다.두 개의 루틴으로 수신 된 한 채널의 데이터

package main 

import (
    "fmt" 
    "os" 
    "time" 
) 

func timeout(duration int, ch chan<- bool) { 
    time.AfterFunc(time.Duration(duration)*time.Second, func() { 
     ch <- true 
    }) 
} 

func watcher(duration int, ch <-chan bool) { 
    <-ch 
    fmt.Println("\nTimeout! no Answer after", duration, "seconds") 
    os.Exit(0) 
} 

func watcher2(duration int, ch <-chan bool) { 
    <-ch 
    fmt.Println("This is watcher 2 as a second receiver") 
} 

func main() { 
    var data = make(chan bool) 
    var duration = 5 

    go timeout(duration, data) 
    go watcher(duration, data) 
    go watcher2(duration, data) 

    var input string 
    fmt.Print("What is 725/25 ? ") 
    fmt.Scan(&input) 

    if input == "29" { 
     fmt.Println("Correct") 
    } else { 
     fmt.Println("Wrong!") 
    } 
} 

당신이 나에게 그것에 대해 약간의 설명을 말할 수 :하지만 내 두 번째 기능은

여기

내 코드가 실행되지? 감사합니다.

+4

채널에서 보낸 항목은 한 번만 수신됩니다. –

답변

1

@Andy Schweig가 언급했듯이 Go 채널에서 한 번만 가져올 수 있습니다. 당신은 여전히 ​​두 번 메시지를 수신 할 경우, 관찰자 ​​디자인 패턴을 사용할 수 있습니다

import "fmt" 

type Observer interface { 
    Notify(message string) 
} 

type Watcher struct { 
    name string 
} 

func (w Watcher) Notify(message string) { 
    fmt.Printf("Watcher %s got message %s\n", w.name, message) 
} 

var watchers = [...]Watcher {{name: "Watcher 1"}, {name: "Watcher 2"}} 
var c = make(chan string) 

func notifier() { 

    var message string 
    for { 
     // Messaged pulled only once 
     message = <- c 

     // But all watchers still receive it 
     for _, w := range watchers { 
      w.Notify(message) 
     } 
    } 
} 

func main() { 
    go notifier() 

    c <- "hello" 
    c <- "how are you?" 
} 
1

channel 당신은 단지 하나 개의 수신기를 해결할 수있는 선언했다. 기본적으로 channelsunbuffered입니다. 즉, 전송 된 값을 수신 할 해당 수신자가있는 경우에만 전송을 허용합니다. 반면에 buffered 채널은 해당 값에 해당 수신기가없는 제한된 수의 값을 허용합니다. 여러 입력을 입력하고 그 이후 수신을 원하면 channelbuffered channel으로 선언해야합니다.

ch := make(chan bool, n) //n being the number of items to buffer