在函数中初始化通道导致 go routine 死锁

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


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 调用返回我的频道。也许 'InputChannel() chan int' getter 会更好?有什么见解吗?谢谢


慕妹3146593
浏览 86回答 1
1回答

暮色呼如

使用了不正确的变量声明形式。所以应该做这样的事情:package inputconst UP = 1const RIGHT = 2const DOWN = 3const LEFT = 4var inputChannel chan inttype 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(....) ”。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go