go - 在go中使用new和channel

标签 go

我在一次技术演讲中找到了下面的代码片段,我对一件事有点困惑。

应该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,它会像以前一样死锁。

https://play.golang.org/p/zrN0D8IYnn

关于go - 在go中使用new和channel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43266868/

相关文章:

mongodb - 如何使用 mgo 插入文档并获取返回值

go - 错误linter在项目路径GoLang中未显示红色下划线

java - 使用 Golang 中的类路径和库路径运行 Java 命令

go - 将 x509 certPool 转换为 pemBytes

go - 制作自定义结构类型的常量全局变量

mysql - 将变量传递给 GoLang 查询

go - 即使进程结束也缓存或保留一个值

memory-leaks - 去(语言): How to use PPROF heap profile to find memory leaks?

go - 在golang中将结构转换为字节数据,反之亦然

google-app-engine - 应用引擎/去 : Using a new version of Go with the SDK