- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
下面的代码 ( http://play.golang.org/p/ikUtdoKOo5 ) 应该向多个客户端广播一条消息。但它不起作用,我不明白为什么。
package main
import "fmt"
type Broadcaster struct {
Clients []Client
}
func (b *Broadcaster) Broadcast(msg string) {
for _, c := range b.Clients {
go func() {
c.Inbox() <- msg
}()
}
}
type Client interface {
Inbox() chan string
}
type TestClient struct {
Messages chan string
}
func (tc TestClient) Inbox() chan string {
return tc.Messages
}
func main() {
client1 := TestClient{Messages: make(chan string)}
client2 := TestClient{Messages: make(chan string)}
broadcaster := Broadcaster{Clients: []Client{client1, client2}}
broadcaster.Broadcast("sos")
fmt.Printf("client1: '%s'\n", <-client1.Messages)
fmt.Printf("client2: '%s'\n", <-client2.Messages)
}
错误:
go run main.go
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive]:
main.main()
/Users/artem/projects/gocode/src/github.com/artemave/broadcaster/main.go:36 +0x1f3
goroutine 3 [chan send]:
main.func·001()
/Users/artem/projects/gocode/src/github.com/artemave/broadcaster/main.go:12 +0x5f
created by main.(*Broadcaster).Broadcast
/Users/artem/projects/gocode/src/github.com/artemave/broadcaster/main.go:13 +0xcd
goroutine 4 [chan send]:
main.func·001()
/Users/artem/projects/gocode/src/github.com/artemave/broadcaster/main.go:12 +0x5f
created by main.(*Broadcaster).Broadcast
/Users/artem/projects/gocode/src/github.com/artemave/broadcaster/main.go:13 +0xcd
更新:
go vet工具揭示了问题:
% go vet
main.go:12: range variable c enclosed by function
最佳答案
这是在 for-range 循环中重新分配 c 引起的一个微妙错误。看起来有点奇怪,但是您在 std 库中的几个地方看到了这种模式:
func (b *Broadcaster) Broadcast(msg string) {
for _, c := range b.Clients {
c := c // redeclare c for the closure
go func() {
c.Inbox() <- msg
}()
}
}
关于go - 广播公司 : all goroutines are asleep - deadlock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23922682/
我正在尝试制作一个代码来扫描一个文件夹链接我的所有文件,并根据他的大小制作一个“前 10 名”,并根据他的内容和他的名字制作一个正则表达式。文件。根据内容,我使用 goroutines 创建 chan
我有一个在 for 循环中运行的 goroutine: func main(){ for _, i := range x{ go httpR
为什么像这样简单的东西不起作用? c1 := make(chan string) c1 <- "foo" fmt.Println(<-c1) 但是如果我把它放在一个 go routine 中它会起作用
下面的代码 ( http://play.golang.org/p/ikUtdoKOo5 ) 应该向多个客户端广播一条消息。但它不起作用,我不明白为什么。 package main import "fm
给定以下简单的 Go 程序 package main import ( "fmt" ) func total(ch chan int) { res := 0 for iter
在继续工作之前,我一直遵循检查 channel 中是否有任何内容的模式: func consume(msg <-chan message) { for { if m, ok := <-ms
我的 dicerolling 程序发生了一次奇怪的崩溃。它工作正常,但最后它总是说: fatal error :所有 goroutine 都处于休眠状态 - 死锁! goroutine 1 [chan
TL; DR:all goroutines are asleep, deadlock!的一种典型情况,但无法弄清 我正在解析Wiktionary XML转储以构建单词数据库。我将每篇文章的文本解析推迟
练习来自:https://tour.golang.org/concurrency/10 描述: In this exercise you'll use Go's concurrency feature
我有以下 Go 代码 package main import ( "fmt" "math/rand" ) const ( ROCK int = iota PAPER
努力学习并发。我遇到了以下错误: fatal error: all goroutines are asleep - deadlock! 我被告知要添加一个 WaitGroup 和一个关闭 channe
package main import ( "fmt" "os" "os/exec" "bufio" "reflect" ) func runTheComman
我想用 Go 开发一个简单的电子邮件发送器,但遇到了一些问题,这是我的实际代码: package main import ( "flag" "sync" "fmt" ) var
下面的代码适用于硬编码的 JSON 数据,但是当我从文件中读取 JSON 数据时不起作用。我收到 fatal error: all goroutines are sleep - deadlock 错误
我正在做一些实验。下面是我的代码。 package main import ( "fmt" "time" ) func main(){ var a chan int a = make(
我试图了解 channel 是如何运作的。我有这个例子: import ( "fmt" "runtime" "time" ) func greet(c chan string)
我正在使用 Golang 构建护理模拟,但遇到了死锁问题。 Goroutines 用于代表每个赛车手。 这个想法是,一旦赛车手达到目标,就会使用一个 channel 来传达哪个赛车手获胜。 谁能发现我
我正在尝试重现问题并使用以下代码得出最小用例。如果我关闭所有 channel (绕过 i == 0 测试),一切都会按预期进行。 Wg 状态递减并触发完成,main 退出正常。当我(故意)跳过关闭其中
这是引用 Go 编程语言中的以下代码 - 第 8 章 p.238 从下面复制自 this链接 // makeThumbnails6 makes thumbnails for each file rec
我想用 Python 将 mime/multipart 消息写入标准输出,然后使用 mime/multipart 包在 Golang 中读取该消息。这只是一个学习练习。 我尝试模拟 this exam
我是一名优秀的程序员,十分优秀!