Size: a a a

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

2020 October 21

А

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

D

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

SA

Saimon Arzin in Golang Developers — русскоговорящее сообщество
Roman Sakal
закрытие через канал ошибок звучит как-то странно. было бы понятно, если бы канал ошибок эскалировал вверх проблему, а закрытие было бы через контекст вниз к воркерам
то есть воркеры лучше прерывать только по контексту, а не ориентироваться на контекст и закрытие канала
код воркера примерно следущий:
func job(ctx context.Context, f Request, name string, dataChan chan interface{}, errChan chan error) {
resp, err := f(ctx)

 select {
 case <-errChan:
   return
 case <- ctx.Done():
   return
 default:
 }
if err != nil {
   errChan <- CallError{
     Name: name,
     Err:  err,
   }
   return
 }

 dataChan <- resp
}
источник

SA

Saimon Arzin in Golang Developers — русскоговорящее сообщество
f(ctx) может выполняться различное время
источник

RS

Roman Sakal in Golang Developers — русскоговорящее сообщество
ну вот вызывающий должен пробросить и контекст и канал с ошибкой, это дублирующий функционал
источник

RS

Roman Sakal in Golang Developers — русскоговорящее сообщество
если нужен специальный контекст для конкретного воркера, его легко создать ctxForWoker, cancelForWorker := context.WithCancel(parentCtx)
источник

SA

Saimon Arzin in Golang Developers — русскоговорящее сообщество
Roman Sakal
ну вот вызывающий должен пробросить и контекст и канал с ошибкой, это дублирующий функционал
не совсем понимаю в чем дублирование
источник

SA

Saimon Arzin in Golang Developers — русскоговорящее сообщество
Roman Sakal
если нужен специальный контекст для конкретного воркера, его легко создать ctxForWoker, cancelForWorker := context.WithCancel(parentCtx)
я так и делаю выше по флоу
  reqCtx, cancel := context.WithTimeout(ctx, timeout)
 defer cancel()
источник

SA

Saimon Arzin in Golang Developers — русскоговорящее сообщество
тогда получается  <-errChan  лишняя операция
источник

RS

Roman Sakal in Golang Developers — русскоговорящее сообщество
ну вот и отлично
от этого reqCtx можно наследовать ещё и WithCancel
источник

RS

Roman Sakal in Golang Developers — русскоговорящее сообщество
errChan можно использовать если ошибка в одном из воркеров требует остановку в других воркерах тоже - для их синхронизации
источник

RS

Roman Sakal in Golang Developers — русскоговорящее сообщество
но опосредовано, через контекст
источник

SA

Saimon Arzin in Golang Developers — русскоговорящее сообщество
Roman Sakal
ну вот и отлично
от этого reqCtx можно наследовать ещё и WithCancel
зачем? cancel который возвращается от WithTimeout не выполняет ту же функцию что и WithCancel()
источник

RS

Roman Sakal in Golang Developers — русскоговорящее сообщество
ну так этот cancel() вызовется либо по таймауту, либо в defer, я так понял есть ещё и третий вариант
источник

RS

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

RS

Roman Sakal in Golang Developers — русскоговорящее сообщество
ну и проблема с errChan - сообщение в этот канал прочитает всего одна горутина, если их больше, то этот способ работать не будет
источник

x

x-foby in Golang Developers — русскоговорящее сообщество
Dmitry
понял, тогда пока для учебы и spew достаточно


есть еще вопрос, пока не понял что я делаю не так
type Id struct {
id int
}

type memoryStorage struct {
data map[Id]User
}


вот так работает, в целом вроде бы и неплохо

однако хотелось попробовать бы вот так
type memoryStorage struct {
data map[
reflect.TypeOf(Id.id)]User
}


т.е создать мапу с динамическим типом ид(дабы при смене типа ид не менять мапу), но не понимаю как
подскажите куда копать плиз
Используйте примитивные типы для ключей.
Да, вы можете использовать в качестве ключа почти что угодно, но, скорее всего, в какой-то перспективе это приведёт вас к болям.
источник

D

Dmitry in Golang Developers — русскоговорящее сообщество
x-foby
Используйте примитивные типы для ключей.
Да, вы можете использовать в качестве ключа почти что угодно, но, скорее всего, в какой-то перспективе это приведёт вас к болям.
да, так я и пытаюсь. просто мне не хотелось в двух местах завязываться на тип ключа
хотел чтобы в одном месте указать тип, а в другом использовтаь тот же тип со ссылкой на первое место
дабы при изменении типа ключа менять только в одном месте
источник

SA

Saimon Arzin in Golang Developers — русскоговорящее сообщество
Roman Sakal
ну и проблема с errChan - сообщение в этот канал прочитает всего одна горутина, если их больше, то этот способ работать не будет
у меня одна горутина, следовательно проблемы нет
источник

SA

Saimon Arzin in Golang Developers — русскоговорящее сообщество
Roman Sakal
ну так этот cancel() вызовется либо по таймауту, либо в defer, я так понял есть ещё и третий вариант
а что значит третий вариант?
источник