2016-10-30 2 views
-3

Привет, я узнаю о рутине и канале. Я немного экспериментирую с каналом, я отправляю данные по каналу и пытаюсь поймать его в двух функциях. Но моя вторая функция не работаетОдна информация в канале, полученная двумя подпрограммами

Вот мой код:

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 только один раз. Если вы все еще хотите получить сообщение дважды, вы можете использовать шаблон проектирования Observer:

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 вы объявили может иметь дело только с одним приемником. По умолчанию channels: unbuffered, что означает, что они будут принимать только отправления, если есть соответствующий приемник для приема отправленного значения. В то время как канал buffered принимает ограниченное количество значений без соответствующего приемника для этих значений. Если вы хотите ввести несколько входных данных и их последующее получение, вам необходимо объявить channel как buffered channel.

ch := make(chan bool, n) //n being the number of items to buffer 
Смежные вопросы