Pull to refresh

Comments 9

Кстати, вместо goto: Exit можно использовать defer statement. Он срабатывает когда оборачивающая функция завершается.

Поэтому в самом начале функции run() можно создать анонимную функцию и положить ее в список defer

func (r *room) run() {
  defer func() {
    // delete room
    delete(allRooms, r.name)
    delete(freeRooms, r.name)
    roomsCount -= 1
    log.Print("Room closed:", r.name)
  }()

///....
}

После этого делать просто:

if len(r.playerConns) == 0 {
  return
}
    res := make(chan string)
    go getDataFromServer(res, "Server1")
    go getDataFromServer(res, "Server2")
    go getDataFromServer(res, "Server3")

    data := <- res
    fmt.Println(data)

В этом примере канал должен быть буферизованным (с длиной буфера, как минимум, 2). Иначе будет утечка горутин. Первая горутина ответит, а остальные зависнут, пытаясь записать ответы в канал, из которого никто не читает. Сборщик мусора такое не ловит.
Я специально упростил. Программа тут все равно завершается.
Это часто встречающаяся ошибка. В обучающей статье лучше обратить внимание на неё, наверное.
UFO just landed and posted this here
Отвечу. Смотрел на него не первый год и никак не мог взяться за обучение. Потом решился и освоил довольно быстро. Теперь не жалею, и, с помощью языка, могу на многих задачах сэкономить много времени.
UFO just landed and posted this here
Вот написал бы кто, как realtime бэкэнд для игры сделать на Go.
Я пытался, но так и не разобрался со всем (Интерполяцией, Предсказанием, бинарным протоколом).
Если когда-нибудь разберусь, мб напишу.
Sign up to leave a comment.

Articles