我正在关注Rob Pike的并发模式示例,这些例子来自他去年的演讲(幻灯片来自这里:http://talks.golang.org/2012/concurrency.slide#30)。
从示例"恢复序列",我不断收到错误:
prog.go:21: cannot use Message literal (type Message) as type string in send
prog.go:43: msg1.str undefined (type string has no field or method str)
prog.go:44: msg2.str undefined (type string has no field or method str)
prog.go:46: msg1.wait undefined (type string has no field or method wait)
prog.go:47: msg2.wait undefined (type string has no field or method wait)
这是我的代码
type Message struct {
str string
wait chan bool
}
func boring(msg string) <- chan string {
c := make(chan string)
waitForIt := make(chan bool)
go func() {
for i := 0; ; i++ {
c <- Message{ fmt.Sprintf("%s: %d", msg, i), waitForIt }
time.Sleep(time.Duration(rand.Intn(1e3)) * time.Millisecond)
<-waitForIt
}
}()
return c
}
func fanIn(input1, input2 <-chan string) <-chan string {
c := make(chan string)
go func() { for { c <- <-input1 } }()
go func() { for { c <- <-input2 } }()
return c
}
func main() {
c := fanIn(boring("joe"), boring("ann"))
for i := 0; i < 10; i++ {
//fmt.Printf("You say %q\n", <-c)
//fmt.Println(<-c)
msg1 := <-c; fmt.Println(msg1.str)
msg2 := <-c; fmt.Println(msg2.str)
msg1.wait <- true
msg2.wait <- true
fmt.Println("--------------")
}
fmt.Println("Your boring, im leaving")
}
和我的Go游乐场:http://play.golang.org/p/6WQE0PUF7J
我做错了什么?
抱歉,我是Go的新手,我想学习它,因为我想将所有应用和工作应用从node.js移到Go。
谢谢!
答案 0 :(得分:4)
YouTube的演讲解释得更好。
您的实际问题是,您是在代码示例的一半。它从string
频道开始 - 然后转到Message
频道。
我已经为你解决了这个问题。请参阅此游乐场链接:http://play.golang.org/p/R60AJWzr0t
基本上,它现在变成了这个。请注意所有频道现在都是Message
频道,而不是string
频道。
type Message struct {
str string
wait chan bool
}
func boring(msg string) <-chan Message {
c := make(chan Message)
waitForIt := make(chan bool)
go func() {
for i := 0; ; i++ {
c <- Message{fmt.Sprintf("%s: %d", msg, i), waitForIt}
time.Sleep(time.Duration(rand.Intn(1e3)) * time.Millisecond)
<-waitForIt
}
}()
return c
}
func fanIn(input1, input2 <-chan Message) <-chan Message {
c := make(chan Message)
go func() {
for {
c <- <-input1
}
}()
go func() {
for {
c <- <-input2
}
}()
return c
}
func main() {
c := fanIn(boring("joe"), boring("ann"))
for i := 0; i < 10; i++ {
//fmt.Printf("You say %q\n", <-c)
//fmt.Println(<-c)
msg1 := <-c
fmt.Println(msg1.str)
msg2 := <-c
fmt.Println(msg2.str)
msg1.wait <- true
msg2.wait <- true
fmt.Println("--------------")
}
fmt.Println("Your boring, im leaving")
}
您的错误意味着什么:
prog.go:21:不能使用Message literal(类型Message)作为send
中的类型字符串
您在第21行的Message
频道上发送string
个实例。将其更改为chan Message
(以及当前为字符串频道的所有其他频道)。
prog.go:43:msg1.str undefined(类型字符串没有字段或方法str)
..其余的,因为你有一个string
频道,每次你从频道播放一些内容时,它就是string
- 而不是Message
。