【问题标题】:How to print contents of channel without changing it如何在不更改频道的情况下打印频道内容
【发布时间】:2015-08-19 06:35:12
【问题描述】:

我正在用 Go 语言编写一个程序,我有一个简单的问题:

我的程序中有一些 goroutines 和 goroutines 用来通信的通道。有时我想检查通道内的内容。我怎样才能在不中断 goroutine 工作的情况下实现这一点?频道有打印内容的功能吗?还是我应该以某种方式复制它们?

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
}

【问题讨论】:

  • 答案是“有点”。请参阅stackoverflow.com/a/26045887/3108853 进行讨论。
  • 所以也许我可以创建变量的深层副本,例如在 ada Obj1.all := Ob2.all 中?
  • 不,因为复制不是原子的。

标签: go


【解决方案1】:

如何在不中断 goroutine 工作的情况下实现这一点?

简单的答案是你不能不打断你。通道是一种同步原语,这意味着它们使并发程序能够安全地通信。如果您从频道中取出某物,“取出”会自动发生,没有其他人可以从同一频道中取出相同的物品。这是故意的。

您可以做的是取出物品并在打印后将它们放回原处。这种方法的问题在于,有些元素可能永远不会被打印,而另一些元素可能会被多次打印,因为所有涉及的 goroutine 都竞相从通道中获取项目。

听起来您需要的不是频道。

【讨论】:

    猜你喜欢
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2022-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    相关资源
    最近更新 更多