在函数中初始化通道导致执行例程死锁

时间:2018-10-31 23:01:36

标签: go

我是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会更好?有见识吗?谢谢

1 个答案:

答案 0 :(得分:1)

正如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(。 ...) ”,就像我以前尝试过的那样。