Читать и писать на том же канале в избранном - PullRequest
0 голосов
/ 16 февраля 2019

Можно ли обмениваться данными между двумя подпрограммами, используя один канал таким образом?

c := make(chan int)

go func() {
    var i int
    select {
    case c<- 1:
        i = <-c
    case i = <-c:
        c<- 1
    }
    fmt.Println(" A - Written 1 red ", i)
}()

var i int
select {
case c<- 2:
    i = <-c
case i = <-c:
    c<- 2
}
fmt.Println(" B - Written 2 red ", i)

1 Ответ

0 голосов
/ 16 февраля 2019

Это работает , но обычно это плохая идея (тм)

ваши будущие разработчики программного обеспечения будут вас ненавидеть за это

Обратите внимание, если эти циклы не совсемто же самое, тогда приложение будет аварийно завершать работу, когда основная программа будет заблокирована из-за того, что никто не будет писать или читать

package main

import (
    "fmt"
)

func main() {
    c := make(chan int)

    go func() {
        for x := 0; x < 5; x++ {
            var i int
            select {
            case c <- 1:
                i = <-c
            case i = <-c:
                c <- 1
            }
            fmt.Println(" A - Written 1 red ", i)
        }
    }()
    for x := 0; x < 5; x++ {
        var i int
        select {
        case c <- 2:
            i = <-c
        case i = <-c:
            c <- 2
        }
        fmt.Println(" B - Written 2 red ", i)
    }
}

Вывод:

 B - Written 2 red  1
 A - Written 1 red  2
 B - Written 2 red  1
 A - Written 1 red  2
 B - Written 2 red  1
 A - Written 1 red  2
 B - Written 2 red  1
 A - Written 1 red  2
 B - Written 2 red  1

Program exited.
...