Комментарии 9
Кстати, вместо goto: Exit можно использовать defer statement. Он срабатывает когда оборачивающая функция завершается.
Поэтому в самом начале функции run() можно создать анонимную функцию и положить ее в список defer
После этого делать просто:
Поэтому в самом начале функции 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
}
+3
res := make(chan string)
go getDataFromServer(res, "Server1")
go getDataFromServer(res, "Server2")
go getDataFromServer(res, "Server3")
data := <- res
fmt.Println(data)
В этом примере канал должен быть буферизованным (с длиной буфера, как минимум, 2). Иначе будет утечка горутин. Первая горутина ответит, а остальные зависнут, пытаясь записать ответы в канал, из которого никто не читает. Сборщик мусора такое не ловит.
+2
НЛО прилетело и опубликовало эту надпись здесь
Вот написал бы кто, как realtime бэкэнд для игры сделать на Go.
Я пытался, но так и не разобрался со всем (Интерполяцией, Предсказанием, бинарным протоколом).
Если когда-нибудь разберусь, мб напишу.
Я пытался, но так и не разобрался со всем (Интерполяцией, Предсказанием, бинарным протоколом).
Если когда-нибудь разберусь, мб напишу.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Делаем многопользовательскую игрy на Go и WebSocket'ах