Ошибки компилятора

Я начал играть с golang после прочтения GOLANG-BOOK. и я пытаюсь создать простой чат TCP. Я создал структуру пользователя и хочу прослушивать каждый канал user.inbound из массива пользователей.

Я знаю, что моя проблема связана с функцией writeUser(), так как она ожидает user.inbound. Я не уверен, как правильно сделать такой канал с множеством пользователей.

это ошибки, которые я получаю от компилятора:

./chatserver.go:22: syntax error: unexpected LCHAN, expecting )
./chatserver.go:25: non-declaration statement outside function body
./chatserver.go:31: non-declaration statement outside function body
./chatserver.go:32: syntax error: unexpected }
  • строка 22 - это функция writeUser()

И это мой код:

type User struct {
    name string
    inbound chan string
    outbound chan string
    conn net.Conn
}

func writeUser(user.inbound chan string) {
// how can I get the user connection?
    err := gob.NewDecoder(user.conn).Encode(inbound)

    if err != nil {
        fmt.Println("Error: ", err)
    }
}


func (chat *Chat) broadcast(username string, message string) {
    outboundMessage := username + ": " + message;

    for _, user := range chat.users {
        user.inbound <- outboundMessage;
    }
}

person D_R    schedule 04.11.2014    source источник
comment
Я отредактировал заголовок вашего вопроса, учитывая, что здесь нет проблем с массивами каналов.   -  person Simon Whitehead    schedule 05.11.2014


Ответы (1)


Вы пытались перейти к каналу inbound пользователя в подписи вашей функции:

func recieve (user.inbound chan string) {
//            ^^^^^  - that part is wrong

Вы не можете перейти к такому свойству объекта в аргументе функции — это не имеет смысла. В этом контексте вам нужен любой канал строк:

func recieve (inbound chan string) {

Что именно вы будете делать с этим каналом, я оставлю вам (вы все равно ничего не делаете с ним в функции).

Остальные ошибки, без сомнения, складываются из первой, учитывая, что такая ошибка может вывести парсер из строя.

Кроме того, у вас есть несколько случайных оборванных точек с запятой внизу в вашем методе broadcast.

person Simon Whitehead    schedule 04.11.2014
comment
Но как я могу получить пользователя внутри функции получения? Я хочу получить пользователя и входящее сообщение. поэтому я мог бы использовать сообщение user.inbound с user.conn - person D_R; 05.11.2014
comment
также я отредактировал вопрос и изменил функцию получения на writeUser, чтобы вы могли понять, что я собираюсь сделать. Я хочу получить входящее сообщение и отправить его обратно пользователю, используя соединение из пользовательской структуры. - person D_R; 05.11.2014
comment
Вам нужно обойти пользователя. Невозможно перейти назад с канала inbound на канал User. Передайте объект User вдоль канала и перейдите вниз к его каналу inbound. - person Simon Whitehead; 05.11.2014
comment
Можно ли передать 2 канала вместе? например: user.inbound <- outboundMessage <- userInstance - person D_R; 05.11.2014
comment
Не так, но вы можете обернуть его в другой объект и передать его дальше. Например: user.inbound <- Wrapper{msg: outboundMessage, u: userInstance,} - person Simon Whitehead; 05.11.2014
comment
Ваш вопрос теперь изменился, и поэтому мы не должны продолжать его в комментариях. Основываясь на коде, который вы только что разместили здесь, я бы посоветовал вам еще раз просмотреть свою книгу по Go и продолжить изучение языка, прежде чем пытаться усложнить его. Вы используете пустой канал struct{} и ожидаете, что он будет типа User — это не так. Вы могли использовать interface и утверждение типа .. но в этом также нет смысла - вам нужен конкретный объект-оболочка, как я сказал в своем предыдущем комментарии. - person Simon Whitehead; 05.11.2014