gpt4 book ai didi

go - 如何使用 channel ?

转载 作者:数据小太阳 更新时间:2023-10-29 03:30:21 24 4
gpt4 key购买 nike

我有一个函数,它接受一个 int 数组并将它们转储到一个 channel 中。

func Dump(a []int, ch chan int) {
for i := range a {
ch <- i
}
close(ch)
}

这个主要没有建立:

func main() {
ch := make(chan int)
arr := []int{1, 2, 3, 4, 5}
Dump(arr, ch)
for i := range ch {
fmt.Printf("Got %v\n", i)
}
}

抛出这个错误:

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan send]:
main.Dump(0xc000078f48, 0x5, 0x5, 0xc00006e060)
/Users/300041738/go-workspace/src/test.go:7 +0x43
main.main()
/Users/300041738/go-workspace/src/test.go:15 +0x9b
exit status 2

然而,这构建:

func main() {
ch := make(chan int)
arr := []int{1, 2, 3, 4, 5}
go Dump(arr, ch)
for i := range ch {
fmt.Printf("Got %v\n", i)
}
}

为什么我必须在 Dump 前面写 go?我不想异步转储数组的内容。

最佳答案

channel 有缓冲区。默认情况下,缓冲区的大小为 0。换句话说,如果要将元素插入到非缓冲 channel ,插入 goroutine 将停止,直到另一个 goroutine 从 channel 检索值。

所以为了好玩,试试这个:

import "fmt"

func Dump(a []int, ch chan int) {
for i := range a {
ch <- i
}
close(ch)
}

func main() {
arr := []int{1, 2, 3, 4, 5}
ch := make(chan int, len(arr)) //specify channel buffer length equal to arr size
Dump(arr, ch)
for {
i, ok := <- ch
if ok {
fmt.Println("received a number !", i)
} else {
fmt.Println("channel is closed, we're done here")
}
}
}

关于go - 如何使用 channel ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54684396/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com