Ответы пользователя по тегу Go
  • В чем разница между http.CreateNewMux() и дефолтным мультиплексором?

    1) Разница лишь в том, что при вызове http.ListenAndServe нужно было бы передавать вторым аргументом созданный ServeMux. Если вы пользуетесь только стандартным пакетом net/http, то проще использовать дефолтный ServeMux, в то же время создание кастомного Mux'а позволяет использовать такие пакеты, как github.com/gorilla/mux

    2) Хороший ответ на SO: https://stackoverflow.com/a/13256311/7752659. Если коротко, то http.ResponesWriter – это interface, а interface, грубо говоря, уже является указателем. http.Request является указателем для того, чтобы при его изменении сервер мог "видеть" эти изменения
    Ответ написан
    Комментировать
  • Гоуротины, каналы, не полностью отрабатывает, как разобраться?

    Ваша программа завершается до того, как zipMaker() успевает обработать все данные: функция main завершается сразу после того, как завершается выполнение цикла.

    Есть несколько вариантов решения этой проблема, какой выбрать, зависит от задачи:
    1) если у вас программа должна работать постоянно, то тогда можно просто залочить ей выполнение. Например, так:
    func main() {
         // your code
    
        locker := make(chan struct{})
        <-locker
    }

    2) если же вам нужно обработать конечное количество изображений, то нужно переработать код. По моему мнению, не нужно вызывать httpGet() и parser() в горутинах. Лучше возвращать []Gallery, после чего проходиться по нему и вызывать горутину для каждого элемента. При этом нужно воспользоваться sync.WaitGroup. Код будет выглядеть примерно так:
    package main
    
    import (
        "log"
        "sync"
        "time"
    )
    
    // Для удобства
    type Gallery int
    
    func main() {
        // То, что должна вернуть функция parser()
        results := []Gallery{5, 6, 7, 8}
    
        var wg sync.WaitGroup
        for _, r := range results {
            wg.Add(1)
            go zipMaker(r, &wg)
        }
     
        log.Println("Wait")
        // Ждём выполнения горутин
        wg.Wait()
        // "Done" напечатается через 2 секунды после "Wait"
        log.Println("Done")
    }
    
    func zipMaker(g Gallery, wg *sync.WaitGroup) {
        defer wg.Done()
        // your code
    
        time.Sleep(time.Second * 2)
    }


    sync.WaitGroup позволяет ждать обработки всех данных. Подробнее можно почитать тут.
    Ответ написан
    3 комментария
  • Как конкурентно писать/читать данные в Go?

    1) Можете. Вы же никак не модифицируете map.
    2) Нужно инициализировать map
    func (p *Parent) Export() (result map[string]Child) {
      result = make(map[string]Child)
      p.mu.Lock()
      defer p.mu.Unlock()
    
      for k, v := range p.Dict {
        result[k] = *v
      }
    
      return result
    }

    3) Да, копируются.
    Ответ написан