是否可以在 Golang 中使用“select”访问通道 ch1、ch2?

Is it possible to access channels ch1, ch2 using `select` in Golang?

我试图调试这段代码,但卡在了这里。我想访问 ch1、ch2 但没有打印任何内容。

package main

import (
    "fmt"
)

type degen struct {
    i, j string
}

func (x degen) CVIO(ch1, ch2 chan string, quit chan int, m, n string) {
    for {
        select {
        case ch1 <- m:
            fmt.Println(x.i)
        case ch2 <- n:
            fmt.Println("ok")
        case <-quit:
            fmt.Println("quit")
            return
        }
    }

}

func main() {
    ch1 := make(chan string)
    ch2 := make(chan string)
    quit := make(chan int)
    x := degen{"goosebump", "ok"}
    go x.CVIO(ch1, ch2, quit, "goosebump", "ok")
}

期望: 它应该打印要生成的通道数据。

它不是很清楚你期望你的代码做什么:

  • main() 结束而不等待 go 例程退出(很可能循环根本不会 运行)。
  • select 中,发送将不会继续,因为没有接收者(spec - “如果容量为零或不存在,则通道是无缓冲的,只有当发送者接收器准备就绪。”)。
  • 没有任何内容发送到 quit 频道。

我怀疑以下 (playground) 可能会达到您的预期。

package main

import (
    "fmt"
    "sync"
)

type degen struct {
    i, j string
}

func (x degen) CVIO(ch1, ch2 chan string, quit chan int, m, n string) {
    for {
        select {
        case ch1 <- m:
            fmt.Println(x.i)
        case ch2 <- n:
            fmt.Println("ok")
        case <-quit:
            fmt.Println("quit")
            return
        }
    }

}

func main() {
    ch1 := make(chan string)
    ch2 := make(chan string)
    quit := make(chan int)
    x := degen{"goosebump", "ok"}
    var wg sync.WaitGroup
    wg.Add(1)
    go func() {
        x.CVIO(ch1, ch2, quit, "goosebump", "ok")
        wg.Done()
    }()

    <-ch1 // Receive from CH1 (allowing "ch1 <- m" in go routine to proceed)
    <-ch2 // Receive from CH2 (allowing "ch2 <- n" in go routine to proceed)

    quit <- 1
    wg.Wait() // Wait for CVIO to end (which it should do due to above send)
}