sách gpt4 ăn đã đi

Hướng dẫn: Kênh, Hướng dẫn về kênh đệm

In lại 作者:IT王子 更新时间:2023-10-29 02:09:56 26 4
mua khóa gpt4 giày nike

我正在阅读 Go 的官方教程,但很难理解 Channel 和 Buffered Channels 之间的区别。教程的链接是 https://tour.golang.org/concurrency/2https://tour.golang.org/concurrency/3

Channel教程中,Channel c先收到[7, 2, 8]的和,即17,然后收到[-9, 4, 0]的和,即-5。从c读取时,先输出-5到x,再输出17到y,后进先出:

gói chính

nhập khẩu "fmt"

func sum(s []int, c chan int) {
sum := 0
for _, v := range s {
sum += v
}
c <- sum // send sum to c
}

hàm main() {
s := []int{7, 2, 8, -9, 4, 0}

c := make(chan int)
go sum(s[:len(s)/2], c)
go sum(s[len(s)/2:], c)
x, y := <-c, <-c // receive from c

fmt.Println(x, y, x+y)
}

(以上输出为-5 17 12)

在缓冲 channel 教程中,输出为 1 2,按 FIFO 顺序:

hàm main() {
ch := make(chan int, 2)
ch <- 1
ch <- 2
fmt.Println(<-ch)
fmt.Println(<-ch)
}

为什么不同?

câu trả lời hay nhất

在您的第一个无缓冲 channel 示例中,chnnael c 没有充当 LIFO。

实际上它的发生是因为go routinesgo routines 并发执行。

如果您调整代码以进行调试,请在 sum 中添加一行以在发送到 channel 之前打印总和。

gói chính

nhập khẩu "fmt"

func sum(s []int, c chan int) {
sum := 0
for _, v := range s {
sum += v
}
fmt.Println("slice:", s)
fmt.Println(sum)
c <- sum // send sum to c
}

hàm main() {
s := []int{7, 2, 8, -9, 4, 0}

c := make(chan int)
go sum(s[:2], c)
go sum(s[2:4], c)
go sum(s[4:6], c)
x, y, z := <-c, <-c, <-c // receive from c
fmt.Println(x, y, z, x+y+z)
}

Đầu ra là:

slice: [4 0]
4
slice: [7 2]
9
slice: [8 -9]
-1
4 9 -1 12

因此,您可以看到 x 收到了通过 channel 发送的第一个数字。

此外,无缓冲 channel 直接将数据发送到接收器。

如果你想了解 đi 中 channel 的架构,你可以观看 this talk of gophercon-2017 .我发现这次演讲非常有帮助。

关于Go 教程 : Channels, Buffered Channels 教程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49832478/

26 4 0
Đề xuất bài viết: html - Golang 保存到 json 文件
Đề xuất bài viết: xmlstarlet 加载外部实体失败
Đề xuất bài viết: Git diff 到 HTML
Đề xuất bài viết: xml - 如何使用 xmllint 来验证内部指定的 xsd?
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress