gpt4 book ai didi

go - 我可以在 go 中使用 make(chan someStruct) 吗?

转载 作者:IT王子 更新时间:2023-10-29 01:18:55 26 4
gpt4 key购买 nike

例如:

type name struct {
name string
age int
}

func main() {
c := make(chan name)

c <- name{"sfsaf", 1}
a, b := <- c

close(c)
}

结果:

fatal error: all goroutines are asleep - deadlock!

我想通过 channel 传递值。我该怎么办?

最佳答案

是的,你可以传递结构。但这不是您的 OP 中的问题。

当没有接收器准备接收时,您在 channel 上发送了一个值。这就是导致你陷入僵局的原因。

channel 期望receiver 阻塞,等待sender。这是通过 Goroutines 完成的。

因此,将您的发送者包装在一个不会立即执行的 goroutine 中。

package main

import (
"fmt"
)

type name struct {
name string
age int
}

func main() {
c := make(chan name)

go func() {
c <- name{"sfsaf", 1}
close(c)
}()

for n := range c {
fmt.Println(n)
}

fmt.Println("channel was closed (all done!).")
}

在 Playground 上看到它:https://play.golang.org/p/uaSuCaB4Ms

这是有效的,因为发送者的 goroutine 还没有执行。直到当前执行的 goroutine 被阻塞。

我们在 for n := range c 循环中被阻塞。这是接收者,坐着等待值(value)。 (使用 for 循环迭代 channel 值是一种常见的模式,因为它会坐下来等待值)。

现在我们在 for 循环中被阻塞等待接收值,内联 gorouting 现在将执行,以在 channel 上发送我们的值。

此外,我们遵循安全做法并自行清理并关闭(c) channel ,发出for循环或select信号声明将不再发送任何值。 发送者总是关闭,接收者从不关闭。这是 for 范围循环用于退出 for 循环并继续执行其余代码的模式。


作为旁注,您通过传递结构的值(而不是指针)做得很好。

如果你传递了一个指针,你必须在对象周围实现一些互斥锁以防止 R/W panic 。

Do not communicate by sharing memory; instead, share memory by communicating.

坚持围绕您的 channel 和 goroutine 传递值,而不是指针,并从中获益。

关于go - 我可以在 go 中使用 make(chan someStruct) 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44480524/

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