我是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会更好?有见识吗?谢谢
答案 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(。 ...) ”,就像我以前尝试过的那样。