Size: a a a

Golang Developers — русскоговорящее сообщество

2020 November 09

D

Dmitry in Golang Developers — русскоговорящее сообщество
благодарю, взял logrus, в целом годится
источник

А

Анатолий in Golang Developers — русскоговорящее сообщество
довольно популярная библиотека
источник

D

Dmitry in Golang Developers — русскоговорящее сообщество
а вот еще вопрос, я изучаю код чата на вебсокетах
https://github.com/gorilla/websocket/blob/master/examples/chat/hub.go
строка 45 содержит case client.send <- message:
это получается мы шлем сообщение в канал
клиент (горутина) прочитает сообщение из канала и вышлет его на браузер
все как бы супер
но это если канал еще жив, если же канал мертв, то мы упадем в панику и рухнет целиком все

существует ли вероятность того что горутина умрет и закроет канал а родитель об этом не узнает ? думаю да
отсюда вопрос, как себя обезопасить и писать в канал только когда он открыт?
источник

D

Dmitry in Golang Developers — русскоговорящее сообщество
да, гугл говорит что нужно прочитать канал чтобы узнать жив ли он и нет возможности узнать жив ли канал без этого действия
источник

RS

Roman Sakal in Golang Developers — русскоговорящее сообщество
Dmitry
а вот еще вопрос, я изучаю код чата на вебсокетах
https://github.com/gorilla/websocket/blob/master/examples/chat/hub.go
строка 45 содержит case client.send <- message:
это получается мы шлем сообщение в канал
клиент (горутина) прочитает сообщение из канала и вышлет его на браузер
все как бы супер
но это если канал еще жив, если же канал мертв, то мы упадем в панику и рухнет целиком все

существует ли вероятность того что горутина умрет и закроет канал а родитель об этом не узнает ? думаю да
отсюда вопрос, как себя обезопасить и писать в канал только когда он открыт?
case client := <-h.unregister:
  if _, ok := h.clients[client]; ok {
   delete(h.clients, client)
   close(client.send)
  }
 case message := <-h.broadcast:
  for client := range h.clients {
   select {
   case client.send <- message:
   default:
    close(client.send)
    delete(h.clients, client)
   }
  }
 }

у вас есть два кейса и они в одной гортине
источник

M

Michael in Golang Developers — русскоговорящее сообщество
Dmitry
господа, подскажите пожалуйста логгер (я нагуглил logrus и glog), возможно есть лучшие альтернативы ?
требуется в целом мало, стандартные 5 уровней логгирования
Логрус или zerolog
источник

D

Dmitry in Golang Developers — русскоговорящее сообщество
Roman Sakal
case client := <-h.unregister:
  if _, ok := h.clients[client]; ok {
   delete(h.clients, client)
   close(client.send)
  }
 case message := <-h.broadcast:
  for client := range h.clients {
   select {
   case client.send <- message:
   default:
    close(client.send)
    delete(h.clients, client)
   }
  }
 }

у вас есть два кейса и они в одной гортине
да, это я понимаю, но если закоментировать delete(h.clients, client) то все рухнет при попытке отправить в закрытый канал
хочу таких вещей избежать
источник

RS

Roman Sakal in Golang Developers — русскоговорящее сообщество
Dmitry
да, это я понимаю, но если закоментировать delete(h.clients, client) то все рухнет при попытке отправить в закрытый канал
хочу таких вещей избежать
не комментируйте эту строку.
А для синхронизации разных горутин используйте контексты и <-ctx.Done()
источник

M

Michael in Golang Developers — русскоговорящее сообщество
у zap Api очень притыренное..
Пожалел что затянул в проект
в итоге всё-таки заменил его zerolog у него все через . и автодополнение доступно и удобно
источник

D

Dmitry in Golang Developers — русскоговорящее сообщество
Roman Sakal
не комментируйте эту строку.
А для синхронизации разных горутин используйте контексты и <-ctx.Done()
спасибо, почитаю
источник

А

Анатолий in Golang Developers — русскоговорящее сообщество
Dmitry
да, это я понимаю, но если закоментировать delete(h.clients, client) то все рухнет при попытке отправить в закрытый канал
хочу таких вещей избежать
а еще если вы создадите указатель и будете с ним работать непроинициализировав тоже рухнет все, суть в том чтоб не коментировать такие вещи

Вообще обрабатывайте панику
источник

x

x-foby in Golang Developers — русскоговорящее сообщество
Michael
у zap Api очень притыренное..
Пожалел что затянул в проект
в итоге всё-таки заменил его zerolog у него все через . и автодополнение доступно и удобно
zap удобен, когда юзается ещё что-то из экосистемы uber.
Например, jaeger)
источник

M

Michael in Golang Developers — русскоговорящее сообщество
x-foby
zap удобен, когда юзается ещё что-то из экосистемы uber.
Например, jaeger)
а в чем удобство?
источник

M

Michael in Golang Developers — русскоговорящее сообщество
он туда пробрасывается?
источник

D

Dmitry in Golang Developers — русскоговорящее сообщество
а какой посоветуете роутер поддерживающий регулярки совместимый с http модулем ?
источник

x

x-foby in Golang Developers — русскоговорящее сообщество
Michael
он туда пробрасывается?
Ну типа того. Там нужно чтоб логер реализовывал этот интерфейс: https://pkg.go.dev/github.com/uber/jaeger-client-go#Logger
Zap его реализовывает
источник

M

Michael in Golang Developers — русскоговорящее сообщество
спасиб, понял
источник

А

Анатолий in Golang Developers — русскоговорящее сообщество
x-foby
Ну типа того. Там нужно чтоб логер реализовывал этот интерфейс: https://pkg.go.dev/github.com/uber/jaeger-client-go#Logger
Zap его реализовывает
что-то мне подскаывает что практически все логеры реализуют этот интерфейс, кроме стандартного )
источник

x

x-foby in Golang Developers — русскоговорящее сообщество
Анатолий
что-то мне подскаывает что практически все логеры реализуют этот интерфейс, кроме стандартного )
Ну zerolog, о котором выше речь шла, не реализовывает, например)
источник

А

Анатолий in Golang Developers — русскоговорящее сообщество
действительно, я думал *f реализуют почти все
источник