5

以下のコードのように、構造体内でスライス chan 型を使用しようとしています。ただし、受信しようとすると

test := <-c.slice

プログラムがハングします。これを行う方法はありますか?

package main

import "fmt"

type blah struct {
    slice chan [][]int
}

func main() {

    slice := make([][]int, 3)
    c := blah{make(chan [][]int)}

    slice[0] = []int{1, 2, 3}
    slice[1] = []int{4, 5, 6}
    slice[2] = []int{7, 8, 9}

    go func() {
        test := <- c.slice
        test = slice
        c.slice <- test
    }()

    fmt.Println(<-c.slice)
}
4

1 に答える 1

10

ゴルーチン内の最初の行はチャネルから受信し、ゴルーチンが作成された後のメインの最初の行も同様です。つまり、システム内の 2 つのゴルーチンのみが両方ともスライス チャネルから受信しようとしており、誰もスライス チャネルに送信しようとしていません。

より一般的に言えば、問題は、誰かが受信 (消費) するために、他の誰かが同時に送信 (生成) しなければならないということです。あなたの例ではそうではないチャネルがバッファリングされた場合、送信は同じゴルーチンで事前に発生する可能性もあります。

たとえば、チャネルには 1 つの要素のバッファーがあるため、これは機能します。これは、送信がブロックされないことを意味します。

ch := make(chan int, 1)
ch <- 1
i := <-ch

送信は受信と同時に行われるため、これも同様に機能します。

ch := make(chan int)
go func() { ch <- 1 }()
i := <-ch

両方のゴルーチンがバッファリングされていないチャネルに送信しようとしていて、誰も受信しようとしていないため、これは機能しません。

ch := make(chan int)
go func() { ch <- 1 }()
ch <- 2

両方のゴルーチンが受信しようとしていて、誰も送信しようとしていないため、これも機能しません。

ch := make(chan int)
go func() { <-ch }()
<-ch

最後のものはあなたのケースです。

于 2013-09-10T03:23:49.807 に答える