猿问

在 Go 中打印频道的内容

如何在 Go 中打印频道的内容?


例如:


package main


import "fmt"


func main() {

    ok := make(chan int)

    ok <- 1

    x := <- ok

    fmt.Println(x)

}

据我了解,ok是一个可以存储整数值的通道。那么,我怎样才能打印它的内容呢?


fmt.Println(ok)不打印存储在通道内的值。


谢谢。


慕田峪9158850
浏览 144回答 3
3回答

一只萌萌小番薯

通道的make(chan int)隐式大小为零(大小为零的通道是无缓冲的。指定大小的通道 make(chan int, n) 被缓冲。在这里,通道<-ok或ok <-将被阻塞,直到有人处理它(并发)。所以,ok := make(chan int)改为ok := make(chan int,1)package mainimport "fmt"func main() {    ok := make(chan int, 1)    ok <- 1    x := <- ok    fmt.Println(x)}或者同时处理它package mainimport "fmt"func main() {    ok := make(chan int)    go func(){       ok <- 1    }()    x := <- ok    fmt.Println(x)}

森林海

在这里你试图写入一个无缓冲的通道,因为没有 go routines 试图从通道读取它会达到死锁情况这是你可以做的package mainimport (    "fmt"    "time")func main() {    ok := make(chan int)    go func() {        for x := range ok {            fmt.Println(x)        }    }()    ok <- 1    ok <- 3    ok <- 2    ok <- 5    ok <- 3    ok <- 9    time.Sleep(1)}

喵喵时光机

除了使用调试器,我没有想到任何其他方法。尝试钻研> main.main() ./main.go:20 (PC: 0x4b68dc)    15: func main() {    16:     17:     c := make(chan int,10)    18:     a:=1    19:     c<-a=>  20:     fmt.Println(<-c)    21:     22:     23: }(dlv) p cchan int {    qcount: 1,    dataqsiz: 10,    buf: *[10]int [1,0,0,0,0,0,0,0,0,0],    elemsize: 8,    closed: 0,    elemtype: *runtime._type {size: 8, ptrdata: 0, hash: 4149441018, tflag: tflagUncommon|tflagExtraStar|tflagNamed|tflagRegularMemory (15), align: 8, fieldAlign: 8, kind: 2, equal: runtime.memequal64, gcdata: *0, str: 847, ptrToThis: 26368},    sendx: 1,    recvx: 0,    recvq: waitq<int> {        first: *sudog<int> nil,        last: *sudog<int> nil,},    sendq: waitq<int> {        first: *sudog<int> nil,        last: *sudog<int> nil,},    lock: runtime.mutex {        lockRankStruct: runtime.lockRankStruct {},        key: 0,},}(dlv) 
随时随地看视频慕课网APP

相关分类

Go
我要回答