2013-09-10 2 views
5

Я пытаюсь использовать тип chan chan внутри структуры, аналогичный приведенному ниже коду. Однако, когда я пытаюсь получить вGolang - Использование chan slice внутри struct

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) 
} 
+0

Это то, что я пытался выяснить на http://play.golang.org/p/dLe0MIrLFw, поэтому переменная называется «blah» – thomas

+0

, комментируя две строки, связанные с тестированием, и просто поместите c.slice < - slice отлично работает ... Так почему я могу что-то вставить в чан, но, похоже, не извлекаю из чан, что я делаю неправильно? – thomas

ответ

10

Первая строка внутри goroutine получает от канала, и таким образом делает первую строку в главной после того, как goroutine создается. Это означает, что только два гортана в системе пытаются получить из канала среза, и никто не пытается отправить в него.

В общем, проблема в том, что для кого-то, кто получает (потребляет), кто-то другой должен одновременно отправлять (производить). Если канал буферизирован, что не так в вашем примере, отправка может также произойти заблаговременно в том же goroutine.

Так это работает, например, потому что канал имеет буфер одного элемента, что означает посыл не будет блокировать:

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

Это работает, как хорошо, так как отправка происходит одновременно с получить:

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

Это делает не работы, потому что оба goroutines пытаются отправить в небуферизованный канал, и никто не пытается получить:

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

Это делает не работы либо, потому что оба goroutines пытаются получить, и никто не пытается отправить:

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

Это последний ваш случай.

+0

Хорошо, это имеет смысл. Спасибо :) – thomas

+0

О, я вижу, отметьте ... спасибо :) Все сделано :) – thomas

Смежные вопросы