Я новичок в 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' был бы лучше? Любое понимание? Спасибо