gpt4 book ai didi

Go 教程 : Channels, Buffered Channels 教程

转载 作者:IT王子 更新时间:2023-10-29 02:09:56 26 4
gpt4 key购买 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,后进先出:

package main

import "fmt"

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

func 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 顺序:

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

为什么不同?

最佳答案

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

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

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

package main

import "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
}

func 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)
}

输出是:

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

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

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

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

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

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