2015-06-04 6 views
2

Я пишу программу на языке Go, и у меня есть простая задача:Как распечатать содержимое канала, не изменяя его

У меня есть некоторые goroutines в моей программе и каналы, с которыми goroutines использовать для связи. Время от времени я хотел бы проверить, что внутри каналов. Как я мог достичь этого, не прерывая работу goroutines? У каналов есть какая-либо функция для печати их содержимого? Или мне как-то их скопировать?

var shelf chan int = make(chan int, 5) 
go Depot(shelf) 
go Shop(shelf) 
var input string 
fmt.Scanln(&input) 
if (input == "print") { 
    //here print what on shelf 
} 
+1

Ответ «своего рода». См. Http://stackoverflow.com/a/26045887/3108853 для обсуждения. – lsowen

+0

Так что, может быть, я coudl создаю глубокую копию переменной, как в ada 'Obj1.all: = Ob2.all'? – whd

+0

нет, потому что создание копии не является атомарным. – thwd

ответ

4

Как я могу добиться того, что, не прерывая работу, которую goroutines'?

Простой ответ заключается в том, что вы не можете, не прерывая. Каналы являются примитивами синхронизации, а это означает, что они позволяют безопасным связывать параллельные программы. Если вы берете что-то из канала, то «вывоз» происходит атомарно, никто другой не может взять один и тот же элемент из того же канала. И это предназначено.

Что вы можете сделать, это взять предметы и вернуть их после печати. Проблема с таким подходом заключается в том, что некоторые элементы никогда не могут быть напечатаны, в то время как другие могут печататься несколько раз, поскольку все горуты участвуют в гонке для захвата предметов из канала.

Похоже, вам нужно что-то еще, кроме канала.

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