在Go中打印频道内容

时间:2018-11-12 17:30:02

标签: go

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

例如:

package main

import "fmt"

func main() {
    ok := make(chan int)
    ok <- 1
    x := <- ok
    fmt.Println(x)
}

据我了解,ok是一个可以存储整数值的通道。那么,如何打印其内容?

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

谢谢。

3 个答案:

答案 0 :(得分:2)

频道make(chan int)的隐式大小为零(参考:https://golang.org/ref/spec#Making_slices_maps_and_channels

大小为零的通道未缓冲。指定大小的通道make(chan int,n)被缓冲。请参阅http://golang.org/ref/spec#Send_statements,以了解有关缓冲通道与无缓冲通道的讨论。 http://play.golang.org/p/VZAiN1V8-P的示例说明了差异。

在这里,频道<-okok <-将被阻止,直到有人对其进行处理(同时)。因此,将ok := make(chan int)更改为ok := make(chan int,1)

package main

import "fmt"

func main() {
    ok := make(chan int, 1)
    ok <- 1
    x := <- ok
    fmt.Println(x)
}

或同时进行处理

package main

import "fmt"

func main() {
    ok := make(chan int)
    go func(){
       ok <- 1
    }()
    x := <- ok
    fmt.Println(x)
}

答案 1 :(得分:1)

这里您要写入一个无缓冲的通道,因为没有go例程试图从该通道读取它会导致死锁情况

这是您可以做的

package main

import (
    "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)
}

您可能会找到发挥作用的链接here

答案 2 :(得分:1)

除了使用调试器之外,我没有想到任何其他方法。试试delve

const cors = require('cors');
app.use(cors());