Size: a a a

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

2020 July 23

А

Анатолий in Golang Developers — русскоговорящее сообщество
какую именно библиотеку и в какой проект?:)
источник

C

Calculon🤖 in Golang Developers — русскоговорящее сообщество
🅚🅘🅝🅓🅔🅡🅦🅞🅝🅓
можно как-то загрузить библиотеку в проект или только через запрос дистанционно к ней подключаться?
закешить зависимости?
источник

C

Calculon🤖 in Golang Developers — русскоговорящее сообщество
читай доку по модулям, прямой ответ намеренно не дам
источник
2020 July 24

P

Pr in Golang Developers — русскоговорящее сообщество
Pr
Всем привет.
Такой вопрос.
Делаю хттп сервер на стандароной либе. У меня есть тип, который содержит все нужные клиенты вызовов внешних апи, конвектор к дб, конектор к редису.
Примерно так
type Box struct {
 DB storage.Repo
 Redis *redis.Client
 ExternalApi *ExternalApiClient
  BusinessLogicSomeType...
}

Из этого типа я раздаю нужные поля через замыкание каждому из хендлеров при старте сервера.
Понятно, что обвязка к дб, например, уже спроектирована с учетом работы из нескольких горутин, по этому можно не переживать за рейс кондишн.
А как быть с остальными типами?
Если каждый запрос на хттп сервер обратывается в отдельной горутине, нужно ли мне обеспечивать потокобезорасность для своих "самописных" типов/клиентов которые могут менять свои данные в процессе выполняения запроса/бизнес логики?
А подскажите, пожалуйста в таком случае.
Какая реализация предпочтительнее?
Каналы или мьютексы?
Логика работы приложения скорее синхронная. Только распедаливание реквестов само-собой происходит конкурентно. Получается, на самом верху обработки, там где начинается бизнес логика, в сигнатурах методов лучше использовать каналы для проброски данных?
источник

P

Pr in Golang Developers — русскоговорящее сообщество
Есть ли что почитать или посмотреть хороший код апишек каких нибудь?
Так сказать, учиться на примерах
источник

x

x-foby in Golang Developers — русскоговорящее сообщество
Так а вы пишете в какой-то общий ресурс?
источник

P

Pr in Golang Developers — русскоговорящее сообщество
Ну я прокидываю типы бизнес логики и коннекторы в хендлер. Где то я могу написать в поромежуточный тип, который встроен как поле
источник

P

Pr in Golang Developers — русскоговорящее сообщество
Но это в рамках "одного метода"
источник

x

x-foby in Golang Developers — русскоговорящее сообщество
Что за "промежуточный тип как поле"?
Это общий ресурс? Он доступен из разных горутин?
источник

P

Pr in Golang Developers — русскоговорящее сообщество
Либо возвращать переменную в которую написал здесь дальше
источник

P

Pr in Golang Developers — русскоговорящее сообщество
Получается, в случае конкурентных запросов доступен
источник

P

Pr in Golang Developers — русскоговорящее сообщество
Ща пример накидаю, если вы не против
источник

C

Calculon🤖 in Golang Developers — русскоговорящее сообщество
Pr
А подскажите, пожалуйста в таком случае.
Какая реализация предпочтительнее?
Каналы или мьютексы?
Логика работы приложения скорее синхронная. Только распедаливание реквестов само-собой происходит конкурентно. Получается, на самом верху обработки, там где начинается бизнес логика, в сигнатурах методов лучше использовать каналы для проброски данных?
Канал и мутех это разные вещи
источник

C

Calculon🤖 in Golang Developers — русскоговорящее сообщество
Для разных целей
источник

P

Pr in Golang Developers — русскоговорящее сообщество
Я понимаю, я имею ввиду что синхронизацию можно делать и тем и другим
источник

C

Calculon🤖 in Golang Developers — русскоговорящее сообщество
Pr
Я понимаю, я имею ввиду что синхронизацию можно делать и тем и другим
Ага
источник

x

x-foby in Golang Developers — русскоговорящее сообщество
Я уверен, что в вашем случае никакая синхронизация не нужна.
Скорее всего, вы просто шарите ресурс, который не нужно шарить.
источник

P

Pr in Golang Developers — русскоговорящее сообщество
Ну вот, примерно так. В код можно не вчитываться, просто как пример, как может происходить
источник

P

Pr in Golang Developers — русскоговорящее сообщество
type BLProcessor struct {
 State            string
 SomeEmbeddedType *SomeEmbeddedType
}

func (b *BLProcessor) Process(bla string) string {
 if bla == "value" {
   b.State = "process"
   b.SomeEmbeddedType = &SomeEmbeddedType{
     Field: bla,
   }

   return b.SomeEmbeddedType.doSome().Result
 }
 return ""
}

type SomeEmbeddedType struct {
 Field string
}

func (s SomeEmbeddedType) doSome() *Result {
 return &Result{
   Result: s.Field + "1",
 }
}

type Result struct {
 Result string
}

type Repo interface {
 GetSome(s string) (string, error)
 SaveSome() error
}

func processReq(db Repo, bl *BLProcessor) http.HandlerFunc {
 return func(w http.ResponseWriter, r *http.Request) {
   someValue := r.URL.Query().Get("value")
   // этот парень, например, сбегал в бд
   outDB, err := db.GetSome(someValue)
   if err != nil {
     println(err)
     return
   }
   
   // этот парень распедалил бизнесс-логику
   out := bl.Process(outDB)
   
   w.Write([]byte(out))
 }
}
источник

C

Calculon🤖 in Golang Developers — русскоговорящее сообщество
SomeEmbeddedType надо мутехом закрыть
источник