我在一次技术演讲中找到了下面的代码片段,我对一件事有点困惑。
应该table <- new(Ball)
放在go player("ping", table)
之前?
为什么我们甚至需要 table <- new(Ball)
?我认为table := make(chan *Ball)
已经创建了 channel 。
这与死锁有关吗?
type Ball struct { hits int }
fun main() {
table := make(chan *Ball)
go player("ping", table)
go player("pong", table)
table <- new(Ball) // game on; toss the ball
time.Sleep(1*time.Second)
<-table // game over; grab the ball
}
func player(name string, table chan *Ball)
for {
ball := <-table
ball.hits++
fmt.println(name, ball.hits)
time.Sleep(100 * time.Millisecond)
table <- ball
}
}
最佳答案
<-
运算符是将某些内容放入 channel 中或将其取出的操作符。它所在的一侧会显示它是否被放入或取出。因为 channel 没有尺寸,所以它实际上无法“容纳”和项目,所以它使得 go
funcs 会阻塞,直到 channel 中有东西放入。两侧(插入和移除)都会阻塞在没有大小的 channel 上,因此如果您在没有接收器的情况下尝试插入某些东西,它会阻塞直到有接收器为止。在此特定代码中,player
func 然后将其删除 <- table
并将其放回 table <-
.
关于您关于搬家的问题table <- new(Ball)
。如果你尝试在没有 catch 手的情况下传球,主队会等待有人 catch 。没有大小的 channel 更像是“传递”对象,因为不涉及存储。相反,如果它是使用缓冲区大小创建的,例如table := make(chan *Ball, 1)
,那么当它已经有 1 个项目时,它只会阻塞(与之前相同)。因此,如果您使用 1 的缓冲区创建它,但尝试在 go
之前在其中放置 2 个球。 funcs,它会像以前一样死锁。
关于go - 在go中使用new和channel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43266868/