我試圖除錯這段代碼,但卡在這里。我想訪問ch1和ch2,但發現什么都沒有列印出來。
package main
import (
"fmt"/span>
)
type degen struct {
i, j string 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")
回傳。
}
}
}
func main() {
ch1 := make(chan string)
ch2 := make(chan string)
quit := make(chan int)
x := degen{"goosebump", "ok"} 。
go x.CVIO(ch1, ch2, quit, "gosebump", "ok")
}
希望如此。 它應該列印將要產生的通道資料。
uj5u.com熱心網友回復:
我不太清楚你希望你的代碼做什么:
我不太清楚你希望你的代碼做什么?
main()沒有等待go例程退出就結束了(很有可能回圈根本就不運行)。- 在
select中,發送將不會繼續,因為沒有接收者(spec - "如果容量為零或沒有,通道是無緩沖的,只有當發送者和接收者都準備好時,通信才會成功。")。 - 沒有東西被發送到
quit通道。
我懷疑下面這個(playground)可能會做你所期待的事情。
package main
import (
"fmt"/span>
"sync"/span>
)
type degen struct {
i, j string 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")
回傳。
}
}
}
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"/span>, "ok"/span>)
wg.Done()
}()
<-ch1 //從CH1接收(允許 "ch1 <- m "在go routine中進行)。
<-ch2 //從CH2接收(允許 "ch2 <- n "在go例程中繼續)。
quit <- 1。
wg.Wait() //等待CVIO結束(由于上述發送,它應該這樣做)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/313781.html
標籤:
上一篇:為什么會出現死鎖,盡管我試著在發送完所有值后關閉通道
下一篇:如何用Go捕捉終端的輸出?
