gpt4 book ai didi

go - 在函数中初始化 channel 导致 go routine 死锁

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

我是 Go 的新手,所以我确定这是我所缺少的简单内容。我正在尝试初始化一个 channel 以从另一个函数捕获用户输入。我尝试了以下方法:

package input

const UP = 1
const RIGHT = 2
const DOWN =3
const LEFT = 4

var inputChannel chan int

type InputReader interface {
ReadNextInt() int
}

func InitInputChannel() chan int {
inputChannel := make(chan int, 1)
return inputChannel
}

func SendInput(inputReader InputReader) {
inputChannel <- inputReader.ReadNextInt()
}

然后我调用了以下代码:

package input

import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
)

type MockedInputReader struct {
mock.Mock
}

func (reader MockedInputReader) ReadNextInt() int {
return 1
}

func TestShouldSendUpValueToChannelWhenUpKeyPressed(t *testing.T) {
inputReader := new(MockedInputReader)
inputReader.On("ReadNextInt").Return(UP)

receiverChannel := SendInput(inputReader)

actualInput := <- receiverChannel
assert.Equal(t, UP, actualInput)
}

查看代码我无法找出问题所在,所以我决定重组一些东西,因为我已经绝望了。我最终得到了以下有效的方法:

package input

const UP = 1
const RIGHT = 2
const DOWN =3
const LEFT = 4

var inputChannel chan int = make(chan int, 1)

type InputReader interface {
ReadNextInt() int
}

func SendInput(inputReader InputReader) chan int {
inputChannel <- inputReader.ReadNextInt()
return inputChannel
}

虽然我很高兴它能正常工作,但我很困惑为什么我的第一个解决方案不起作用。当只需要抓取一次时,我也不太愿意为每次 SendInput 调用返回我的 channel 。也许 'InputChannel() chan int' getter 会更好?有什么见解吗?谢谢

最佳答案

正如 ThunderCat 在对我的问题的评论中提到的,我使用了不正确的变量声明形式。所以我应该做这样的事情:

package input

const UP = 1
const RIGHT = 2
const DOWN = 3
const LEFT = 4

var inputChannel chan int

type InputReader interface {
ReadNextInt() int
}

func InitChan() chan int {
inputChannel = make(chan int, 1)
return inputChannel
}

func SendInput(inputReader InputReader) {
inputChannel <- inputReader.ReadNextInt()
}

要注意的关键是“inputChannel = make(.....)”而不是“inputChannel := make(。 ...)' 就像我以前尝试过的那样。

关于go - 在函数中初始化 channel 导致 go routine 死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53093089/

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