2016-10-30 4 views
-3

こんにちは私はルーチンとチャンネルについて学びます。 私はチャネルでいくつかの実験を行い、チャネルを介してデータを送信し、2つの機能でそれを捕らえようとします。しかし、私の第二の機能は、ここでチャンネル内の1つのデータが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回のみ受信されます。 –

答えて

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あなたが1つの受信機のみを扱うことができると宣言しました。デフォルトではchannelsunbufferedです。つまり、送信された値を受信する受信機がある場合にのみ送信を受け付けます。一方、bufferedチャネルは、それらの値に対応する受信機なしで、限られた数の値を受け入れます。複数の入力とそれに続く受信を注入する場合は、channelbuffered channelと宣言する必要があります。

ch := make(chan bool, n) //n being the number of items to buffer 
関連する問題