Инициализация канала в функции, вызывающей обычную тупиковую ситуацию - PullRequest
0 голосов
/ 01 ноября 2018

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

1 Ответ

0 голосов
/ 01 ноября 2018

Как упомянул 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 (... .) ', как я пытался раньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...