Задать вопрос
  • Как правильно взаимодействовать с каналами?

    То, что в канал данные пишутся медленнее, чем читаются, не должно вызывать никаких проблем при правильном подходе. У вас просто очень странно написан воркер, он на каждое событие запускает горутину и почему-то останавливается, если буфер канала пустой. Воркера надо по-хорошему останавливать, когда канал закрыт, а не пуст.

    Лучше сделать так
    package main
    
    import (
    	"bufio"
    	"fmt"
    	"os"
    	"sync"
    )
    
    func main() {
    	urls := make(chan string)
    	go fillChannel(urls)
    
    	// создаем группу для ожидания, того, что все воркеры завершены
    	wg := &sync.WaitGroup{}
    
    	for i := 0; i < 5; i++ {
    		// при запуске каждого воркера, увеличиваем счетчик в группе на 1
    		wg.Add(1)
    		go requestWorker(urls, wg)
    	}
    
    	// ждем, пока счетчик в группе не будет равен 0
    	wg.Wait()
    }
    
    func requestWorker(channel <-chan string, wg *sync.WaitGroup) {
    	// По завершении воркера счетчик в группе будет уменьшен на 1
    	defer wg.Done()
    	// Заодно пишем сообщение о завершении воркера
    	defer println("Worker stopped")
    
    	// Постоянно читаем из канала новые сообщения
    	// цикл автоматически завершится, когда канал закроется и буфер будет пуст
    	for url := range channel {
    		println(url)
    	}
    }
    
    func fillChannel(channel chan<- string) {
    	file, err := os.Open("data.txt")
    	defer file.Close()
    
    	if err != nil {
    		fmt.Println(err)
    		return
    	}
    
    	fileScanner := bufio.NewScanner(file)
    	fileScanner.Split(bufio.ScanLines)
    
    	for fileScanner.Scan() {
    		channel <- fileScanner.Text()
    	}
    
    	// закрываем канал, когда данные кончились
    	// в го принято, чтобы канал закрывал только тот, кто в него пишет
    	close(channel)
    }



    Этот паттерн называется worker pool. Мы пишем в канал все нужные данные и закрываем канал, когда данные кончились. Благодаря тому, что воркеры читают из канала через range, цикл просто выходит, когда канал закрыт и воркеры завершаются.
    WaitGroup используется для того, чтобы подождать, пока воркеры доработают последние данные.
    Ответ написан
    Комментировать
  • Как передавать MouseEvent на canvas, перекрытый div?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    .div {
      pointer-events: none; /* отключить указатели на диве */
    }
    
    .div * {
      pointer-events: all; /* включить на внутренних элементах управления */
    }
    Ответ написан
    Комментировать
  • Можно ли получить доступ к исходному коду скомпилированного Go приложения?

    DedIsDead
    @DedIsDead
    Go, нельзя, т.к. инфы в машинном коде мало, по этому нельзя, но c# можно, и там уже нужно защищать код, а в Go нельзя
    Ответ написан
    5 комментариев
  • Можно ли получить доступ к исходному коду скомпилированного Go приложения?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    правильно
    Ответ написан
    Комментировать
  • Как правильно указать тип?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Вынеси всю одинаковость в новую функцию. Обработки ошибок и прочее. А кастомные вещи пускай будут в специальных функциях TaskLocal, TaskRemote. Там у тебя останется 5 строчек (я так думаю).
    Ответ написан
    Комментировать
  • Куда сохраняются пакеты go get?

    От переменной GOPATH в Go Modules проекте ничего не зависит, все зависимости сохраняются в так называемый кэш модулей (go envGOMODCACHE). По умолчанию после установки эта переменная смотрит на /Users/user.name/go/pkg/mod.

    Для использования зависимостей вместе проектом рассмотрите vendoring (go mod vendor).
    Ответ написан
    Комментировать
  • Как правильно определить какой JSON вернулся?

    Успешность обычно проверяют по http-коду ответа.

    Если же сервис сделан так, что код ответа всегда 200, то единственный верный способ будет пытаться анмаршалить оба и смотреть на поля, всё верно.
    Ответ написан
    1 комментарий