通道数组的范围
Range over array of channel
我可以跨通道范围以从中获取值,但是当我尝试从通道数组中读取时出现错误。
我所做的就是创建包含 2 个通道的通道数组,第一个包含 1 到 5 的值,第二个包含 6 到 10 的值,我只想从通道数组中读取值本身。
这是我的代码:
package main
import "fmt"
func main() {
channelList := make([]chan int, 2)
for i := 0; i < 1; i++ {
channelList = append(channelList, make(chan int))
}
FChannel := make(chan int, 5)
for i := 1; i <= 5; i++ {
FChannel <- i // contain values from 1 to 5
}
close(FChannel)
channelList = append(channelList, FChannel)
SChannel := make(chan int, 5)
for j := 6; j <= 10; j++ {
SChannel <- j // contain values from 6 to 10
}
close(SChannel)
channelList = append(channelList, SChannel)
for _, c := range channelList {
for range c {
fmt.Println(<-c)
}
}
}
但它给了我这个错误:
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive (nil chan)]:
main.main()
这是因为您首先创建了两个没有缓冲且没有值的通道。然后,您附加两个带有缓冲和值的通道。
当您跨越频道时,您会从第一个空频道读取数据,这将永远阻塞。
编辑
这是清理后的代码:
package main
import "fmt"
func main() {
channelList := make([]chan int, 0, 2)
FChannel := make(chan int, 5)
for i := 1; i <= 5; i++ {
FChannel <- i // contain values from 1 to 5
}
close(FChannel)
channelList = append(channelList, FChannel)
SChannel := make(chan int, 5)
for j := 6; j <= 10; j++ {
SChannel <- j // contain values from 6 to 10
}
close(SChannel)
channelList = append(channelList, SChannel)
for _, c := range channelList {
for v := range c {
fmt.Println(v)
}
}
}
我得到的输出是
1
2
3
4
5
6
7
8
9
10
我可以跨通道范围以从中获取值,但是当我尝试从通道数组中读取时出现错误。
我所做的就是创建包含 2 个通道的通道数组,第一个包含 1 到 5 的值,第二个包含 6 到 10 的值,我只想从通道数组中读取值本身。
这是我的代码:
package main
import "fmt"
func main() {
channelList := make([]chan int, 2)
for i := 0; i < 1; i++ {
channelList = append(channelList, make(chan int))
}
FChannel := make(chan int, 5)
for i := 1; i <= 5; i++ {
FChannel <- i // contain values from 1 to 5
}
close(FChannel)
channelList = append(channelList, FChannel)
SChannel := make(chan int, 5)
for j := 6; j <= 10; j++ {
SChannel <- j // contain values from 6 to 10
}
close(SChannel)
channelList = append(channelList, SChannel)
for _, c := range channelList {
for range c {
fmt.Println(<-c)
}
}
}
但它给了我这个错误:
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive (nil chan)]: main.main()
这是因为您首先创建了两个没有缓冲且没有值的通道。然后,您附加两个带有缓冲和值的通道。
当您跨越频道时,您会从第一个空频道读取数据,这将永远阻塞。
编辑
这是清理后的代码:
package main
import "fmt"
func main() {
channelList := make([]chan int, 0, 2)
FChannel := make(chan int, 5)
for i := 1; i <= 5; i++ {
FChannel <- i // contain values from 1 to 5
}
close(FChannel)
channelList = append(channelList, FChannel)
SChannel := make(chan int, 5)
for j := 6; j <= 10; j++ {
SChannel <- j // contain values from 6 to 10
}
close(SChannel)
channelList = append(channelList, SChannel)
for _, c := range channelList {
for v := range c {
fmt.Println(v)
}
}
}
我得到的输出是
1
2
3
4
5
6
7
8
9
10