Могу ли я открыть закрытый канал? - PullRequest
0 голосов
/ 21 октября 2018

Я пытаюсь выяснить, могу ли я снова открыть канал после его закрытия.

Контрольный пример:

  1. У меня есть канал с некоторыми вещами в нем
  2. Я хочу выбрать диапазон, поэтому мне нужно заранее закрыть канал
  3. Я хочу поместить больше материала в канал и повторить его еще раз
go func() {
    queue <- "1"
    queue <- "2"
    close(queue)
}()

for i := range queue {
    go func(i string) {
        fmt.Println("From queue: ", i)
    }(i)
}

go func() {
    open(queue)
    queue <- "3"
    queue <- "4"
    close(queue)
}()

for i := range queue {
    go func(i string) {
        fmt.Println("From queue: ", i)
    }(i)
}
  • Конечно, open не существует.Как я могу реализовать что-то вроде того, что мне нужно в Go?
  • Я не хочу использовать функцию Sleep

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Я хочу наложить на них диапазон , поэтому мне нужно заранее закрыть канал

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

Приведенный ниже код принимает консольный ввод и передает его на канал:

main.go

package main

import (
    "log"
    "bufio"
    "os"
    "fmt"
)

func process(c chan string) {
    for s := range c {
        log.Println("processed", s)
    }
}

func main() {
    c := make(chan string, 10)
    go process(c)

    // get from console and process
    reader := bufio.NewReader(os.Stdin)
    fmt.Println("INPUT STUFF. TYPE #quit TO EXIT.")
    for {
        input, _, _ := reader.ReadLine()
        if string(input) == "#quit" {
            break
        }
        c <- string(input)
    }

    log.Println("BYE!")
}

выход

INPUT STUFF. TYPE #quit TO EXIT.
hello
2018/10/23 10:43:52 processed hello
world
2018/10/23 10:43:54 processed world
#quit
2018/10/23 10:43:57 BYE!

В приведенном ниже примере используется Sleep(), и его можно запустить в качестве игровой площадки Go фрагмент

package main

import (
    "log"
    "time"
)

func process(c chan string) {
    for s := range c {
        log.Println("processed", s)
    }
}

func main() {
    c := make(chan string, 10)

    go process(c)

    // push some data
    c <- "barry allen"
    c <- "iris west"

    time.Sleep(time.Second * 2)

    // push more data
    c <- "joe west"
    c <- "caitlin snow"

    time.Sleep(time.Second * 3)
}

вывод

2009/11/10 23:00:00 processed barry allen
2009/11/10 23:00:00 processed iris west
2009/11/10 23:00:02 processed joe west
2009/11/10 23:00:02 processed caitlin snow

Надеюсь, это поможет.Cheers,

0 голосов
/ 21 октября 2018

Вы не можете открыть закрытый канал, но вы можете отправить channel по каналу, возможно это то, что вы ищете ?

package main

import (
    "fmt"
    "time"
)

func main() {
    queue := make(chan chan int)
    defer close(queue)

    go func() { // reader
        for {
            ch := <-queue
            for i := range ch {
                fmt.Println(i)
            }
            fmt.Println("Done with this channel")
        }
    }()

    go func() { // writer-1
        ch := make(chan int)
        defer close(ch)
        queue <- ch
        ch <- 4
        ch <- 2
    }()

    go func() { // writer-2
        ch := make(chan int)
        defer close(ch)
        queue <- ch
        ch <- 4
        ch <- 20
    }()
    time.Sleep(time.Second)
}
...