Распечатать содержимое канала в Go - PullRequest
0 голосов
/ 12 ноября 2018

Как мне распечатать содержимое канала в Go?

Например:

package main

import "fmt"

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

Как я понимаю, ok - это канал, который может хранить целочисленное значение. Итак, как мне распечатать его содержимое?

fmt.Println(ok) не печатает значение, хранящееся в канале.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Здесь вы пытаетесь записать в небуферизованный канал, так как нет никаких подпрограмм 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)
}

Вы можете найти ссылку на игровую площадку здесь

0 голосов
/ 12 ноября 2018

Каналы make(chan int) имеет неявный нулевой размер (ref: 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 иллюстрирует разницу.

Здесь канал <-ok или ok <- будет заблокирован, пока кто-то не обработает его ( одновременно ). Итак, измените 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...