Ответы пользователя по тегу Go
  • Можно ли писать server-side на нескольких языках одновременно?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Попробуйте микросервисы на обоих языках, а связь по REST API или net/rpc, протобуфер есть скорее всего под оба языка программирования.

    В продакшине наблюдаю в разных сочетаниях Golang/PHP/Node.JS/Bash/Си/Python и ничего, нормально.
    Ответ написан
    Комментировать
  • Как правильно загружать пакеты для Go?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Поставьте pkg-config стандартным установщиком в вашей операционной системе.
    В Gentoo это делается так:
    # emerge -pv pkg-config
    
    Calculating dependencies... done!
    [ebuild  N     ] dev-libs/libyaml-0.1.6  USE="-doc -examples -static-libs {-test}" 492 kB
    [ebuild  N     ] app-eselect/eselect-ruby-20131227  2 kB
    [ebuild  N     ] dev-util/ragel-6.7-r1  USE="-vim-syntax" 1,156 kB
    [ebuild  N     ] dev-lang/ruby-2.0.0_p647-r1:2.0  USE="berkdb gdbm ipv6 ncurses rdoc readline ssl -debug -doc -examples -rubytests -socks5 -xemacs" CPU_FLAGS_X86="sse2" 8,110 kB
    [ebuild  N     ] dev-lang/ruby-2.1.7:2.1  USE="berkdb gdbm ipv6 ncurses rdoc readline ssl -debug -doc -examples -rubytests -socks5 -xemacs" 9,154 kB
    [ebuild  N     ] dev-ruby/rubygems-2.2.5-r1  USE="-server {-test}" RUBY_TARGETS="ruby20 ruby21 (-ruby19)" 408 kB
    [ebuild  N     ] virtual/rubygems-10  RUBY_TARGETS="ruby20 ruby21 (-ruby19)" 0 kB
    [ebuild  N     ] dev-ruby/rake-0.9.6-r1  USE="-doc {-test}" RUBY_TARGETS="ruby20 ruby21 (-ruby19)" 121 kB
    [ebuild  N     ] dev-ruby/json-1.8.2-r1  USE="-doc {-test}" RUBY_TARGETS="ruby20 ruby21 (-ruby19)" 149 kB
    [ebuild  N     ] dev-ruby/racc-1.4.11  USE="-doc {-test}" RUBY_TARGETS="ruby20 ruby21 (-ruby19)" 111 kB
    [ebuild  N     ] dev-ruby/rdoc-4.0.1-r2  USE="-doc {-test}" RUBY_TARGETS="ruby20 ruby21 (-ruby19)" 457 kB
    [ebuild  N     ] dev-ruby/pkg-config-1.1.5  USE="{-test}" RUBY_TARGETS="ruby20 (-ruby19)" 19 kB
    
    Total: 12 packages (12 new), Size of downloads: 20,175 kB

    В других linux-операционках
    # apt get pkg-config
    # yim install pkg-config
    и так далее...

    Но главное научитесь читать что вам компьютер пишет при проблемах.
    pkg-cinfig: exec: "pkg-config": executable file not found in %PATH%

    Читается это так:
    запуск "pkg-config": исполняемый файл не найден в %PATH%

    Раз не найден - значит надо установить. Это известная программа сборщик для некоторого софта.

    Причина по которой Golang библиотека вдруг этого захотела - внутренний биндинг в ней или в какой-то другой которую она используется и которой пока не установлено на ваш компьютер. Про биндинги (склейка Golang и Си библиотек) почитайте отдельно.
    Ответ написан
    2 комментария
  • Какой тип данных должна принимать функция?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Учитесь читать документацию. https://godoc.org/github.com/tealeg/xlsx#File
    1. находите функцию с которой всё началось,
    func OpenFile(filename string) (file *File, err error)

    2. видите что она возвращает тип File, находите этот тип,
    type File struct {
        Date1904 bool
    
        Sheets []*Sheet
        Sheet  map[string]*Sheet
        // contains filtered or unexported fields
    }

    3. видите что в Sheets находится слайс *Sheet
    4. находите тип Sheet
    type Sheet struct {
        Name        string
        File        *File
        Rows        []*Row
        Cols        []*Col
        MaxRow      int
        MaxCol      int
        Hidden      bool
        Selected    bool
        SheetViews  []SheetView
        SheetFormat SheetFormat
    }

    5. изучаете... что где куда и зачем... https://godoc.org/ и исходный код вам в помощь. И больше не задавайте таких вопросов, а то ленивым помогать не хочется:)
    Ответ написан
    Комментировать
  • Как решить проблему с DATA RACE?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Вам стоит посмотреть на подход с другой стороны. Для чего вам цикл? Сделайте его в каждой горутине Request(). По одной горутине на каждый объект Loc. Для управления (стартом/стопом между итерациями) используйте канал.
    До остального дойдёте сами, либо не дойдёте - как знать:)
    Ответ написан
  • Почему возвращает значение третей рутины?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Вот два примера для проверки что всё на самом деле работает верно (если мы правильно понимаем в чём вопрос).
    package main
    
    import "fmt"
    import "time"
    
    func getDataFromServer(res chan string, serverName string, delay int64) {
    	fmt.Println(serverName)
    	time.Sleep(time.Duration(delay)*time.Second)
    	res <- "test_"+serverName
    }
    
    func main() {
      res := make(chan string, 3)
      go getDataFromServer(res, "Server1", 10)
      go getDataFromServer(res, "Server2", 11)
      go getDataFromServer(res, "Server3", 12)
    
      data := <- res
      fmt.Println(data)
    }
    Server3
    Server1
    Server2
    test_Server1

    package main
    
    import "fmt"
    import "time"
    
    func getDataFromServer(res chan string, serverName string, delay int64) {
    	fmt.Println(serverName)
    	time.Sleep(time.Duration(delay)*time.Second)
    	res <- "test_"+serverName
    }
    
    func main() {
      res := make(chan string, 3)
      go getDataFromServer(res, "Server1", 15)
      go getDataFromServer(res, "Server2", 11)
      go getDataFromServer(res, "Server3", 12)
    
      data := <- res
      fmt.Println(data)
    }
    Server3
    Server1
    Server2
    test_Server2

    Golang сам решает когда контекст переключать для большей производительности и меньших накладных расходов.
    Ответ написан
    Комментировать
  • Что скажете о моей реализации логирования?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Посмотрите в сторону уже готовых систем логирования (Graphite, influxdb, прочее) и мониторинга (mrtg, rrd).

    Качество вашего кода и дизайна самого приложения прилично низкое. Бенчмарков не делали вообще никаких. Не поймите не правильно, код читается не плохо, достаточно чистый, но по сути бесполезный.

    По поводу бенчмарков. Вы утверждаете что "вставка в редис"+"вставка в mysql" работает быстрее чем "вставка в mysql". Это по меньшей мере выглядит заблуждением, потому что тот же редис на том же сервере (на сколько я понял) и производительности прибавить не может. Изменился разве что немного подход к записи в MySQL.

    Варианты которые у вас были при написании своего логера:
    1. писать в MySQL по запросу каждый раз когда срабатывает некое событие и появляется запись в логе
    2. накапливать пачку логов в оперативной памяти - пушить в MySQL точно так же как после редиса (долой редис), за одно научитесь ограничивать потребление памяти (вы ведь не можете бесконечно склодировать данные)
    3. накапливать пачку логов в файл (банальный бинарный файл), раз в N минут менять лог-файл
    4. вариант тот же что и третий, только старые логи переносить в базу в фоне.

    Тут надо так же обратить внимание на то для чего логи пишутся:
    1. что бы точно знать кто где и что делал (доктилоскопия пользователей)
    2. что бы делать реал-тайм подстройку других алгоритмов в зависимости от поведения пользователей, системы и всего такого
    3. что бы просто быть в курсе что приложение упало (кстати в этом случае ваш код отправит емейл?:))

    У меня есть задача по сохранении метрики всякой. Условия:
    1. MySQL - для показа потом агрегированных графиков и просто списков что сделалось за определённый промежуток времени.
    2. Shared-хостинг где можно запускать бинарники, но нельзя делать fork'и и по сути ставить ничего кроме Golang приложения и PHP скриптов.
    3. Golang приложение которое щёлкает задачки как семечки и метрик просто туча - считай только их и писать.

    Без накопления и группировки MySQL только и занимается что вставкой в таблицу с метрикой. В планах хранить в бинарных блобах. Ставить тот же Графит на Shared-хостинг для такой простой задачки считаю избыточно:)
    Ответ написан
  • Какую GO либу посоветуете для написания демонов?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Попробуйте стандартные для linux start-stop-daemon в init.d скриптах, при условии что у вас Linux и не systemd.
    Ответ написан
  • Как сделать эту функцию не такой страшной?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    func dataValid(result []string) bool {
      if v.IsLogin(result[0]) == true {

    Вы уверены что там всегда будут прилетать значения в функцию?:) Прилетит что-нибудь пустое и вуаля...
    Ответ написан
  • Будет ли польза в такой затеи?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Постепенно собираю свой архив решений на все случаи жизни, у меня для этого отдельный репозитарий на github.com/mantyr/runner и вообще прочие не связанные с Golang вещи тут imagick.metlan.ru плюс ребята знакомые пишут как минимум два проекта с подсказками по программированию в виде каталогов (но Golang там врядли будет в ближайшее время). Так же не плохи ресурсы stackoverflow.com и https://www.socketloop.com/tutorials/

    По Golang же самые лучшие ресурсы: godoc.org https://golang.org/pkg/ 4gophers.ru

    В любом случае ваш проект - это ваш опыт, как программирования так и поиска и сбора информации, её представления публике. Учитесь и всё получится. И поделитесь ссылкой когда будете готовы.
    Ответ написан
  • GIN: можно ли вложить роутер в роутер?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Просто соблюдайте входные и выходные параметры. Возвращать функции с нужным перечнем входных и выходных параметров тоже можно. Остальное дело техники.
    Ответ написан
  • Как полностью убить дочерний процесс?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    go run имеет особенности, к примеру вы можете запустить его в консоли и забыть - от консоли он спокойно отвяжется. Тут у вас аналогичная ситуация. Если вы хотите запускать некий код в "дочернем" процессе то делайте это явно:
    1. через fork() - что не желательно
    2. через go-рутины
    3. ...
    Но, судя по всему, вы пытаетесь скрестить Golang приложение с приложением на другом языке (иначе откуда такие заморочки). В таком случае вам нужно:
    1. научить приложение (first.go) понимать сигналы операционной системы, для этого изучите os.Signal и syscall.SIGKILL (вообще почитайте на тему какие сигналы надо обрабатывать при завершении приложения) и завершайте приложение правильно в нужный момент
    2. всё таки скомпилируйте вначале в бинарник, go install first.go и используйте уже именно его...

    Ну и напоследок - не надо так расходовать ресурсы - запускать N раз другую программу что бы просто посчитать несколько однотипных цифр. Сформируйте программу более ёмко, отправьте ей кучу данных и получите от неё другую кучу результатов разом. Или сделайте многопоточный сервис который принимает запросы и выдаёт ответы.
    Ответ написан
    2 комментария
  • Как и где инициализировать все компоненты проекта на Go в стиле ООП?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Евгений правильно написал - самый правильный способ. Вообще точка входа в программе всегда одна (main и init), а уже потом init и прочие функции в пакетах которые вызывают из package main.

    package main
    import mypackage
    
    func init() {
    ... что-то сделали, что-то инициализировали, например доступ к базе или ещё чему
    ... ещё что-то инициализировали...
    ... начинаем инициализировать mypackage
    mypackage.DB = DB // проинициализировали доступ в базу в пакете:)
    mypackage.Other = Other // ещё что-то проинициализировали в пакете...
    }
    
    func main() {
    ... другой вопрос что можно и так, но в этом случае в пакете чуть больше логики...
       obj := package.Init()
       obj.SetDB(DB)
       obj.SetOther(Other)
    
       go obj.Start()
    }

    При желании можно ещё пару способов придумать...
    Ответ написан
    2 комментария
  • Как в go, в пакете template переводить в текст не все теги?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Вначале берём html/template и читаем исходники, видим что там используется text/template, потом читаем godoc к обоим пакетам и видим что text/template базовый и имеет больше полезной информации. Там же находим блок.

    Examples

    Here are some example one-line templates demonstrating pipelines and variables. All produce the quoted word "output":

    {{"\"output\""}}
    	A string constant.
    {{`"output"`}}
    	A raw string constant.
    {{printf "%q" "output"}}
    	A function call.
    {{"output" | printf "%q"}}
    	A function call whose final argument comes from the previous
    	command.
    {{printf "%q" (print "out" "put")}}
    	A parenthesized argument.
    {{"put" | printf "%s%s" "out" | printf "%q"}}
    	A more elaborate call.
    {{"output" | printf "%s" | printf "%q"}}
    	A longer chain.
    {{with "output"}}{{printf "%q" .}}{{end}}
    	A with action using dot.
    {{with $x := "output" | printf "%q"}}{{$x}}{{end}}
    	A with action that creates and uses a variable.
    {{with $x := "output"}}{{printf "%q" $x}}{{end}}
    	A with action that uses the variable in another action.
    {{with $x := "output"}}{{$x | printf "%q"}}{{end}}
    	The same, but pipelined.



    Иными словами сделайте {{`{`}} и {{`}`}} или {{"{"}} и {{"{"}} там где нужно "абфусцировать тег".
    Что бы не писать постоянно кучу скобок - можно прописать Delims("{", "}"), но как именно выясните сами:)
    func (t *Template) Delims(left, right string) *Template


    Возможно есть ещё несколько вариантов решения, если теги которые надо игнорировать не во вставляемом в шаблон тексте.
    Ответ написан
  • Что за язык Go, и где его можно хостить?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Хостить можно где угодно. Но чисто шаринг-хостинги полноценно не подойдут.
    1. на шаринг-хостингах почти никогда нельзя открыть порт для входящих соединений (веб-сервер на Golang уже не запустишь, точнее работать-то он будет, но порт не откроет)
    2. на шаринг-хостингах часто нельзя вызывать fork(), тобишь создавать процессы, что бы Golang самопроизвольно не падал - нужно в коде сознательно запретить вызов fork(), посмотрте описание библиотеки runtime
    3. на шаринг-хостингах Golang можно запустить как и любой другой бинарник, достаточно иметь доступ по консоли, возможность что-то запустить через cron или разрешённый вызов exec и его аналоги в PHP

    С другой стороны, стоимость отличного VPS с SSD на 22 гигабайта, полноценным ядром процессора и 512 мегабайтами оперативки стоит в DigitalOcean 5$...

    В качестве первого языка стоит посмотреть на школьную программу:
    1. Turbo/Borland Pascal
    2. Си/Си++
    3. Лого Миры
    4. Delphi
    5. Ничто не мешает в этот перечень добавить Golang, он отлично вписывается, ведь главные составляющие там есть.
    Плюс обучение программированию - это ещё и алгоритмы и подходы, а никак не фреймворки и hello world странички в интернете... Так что Yii, Drupal и прочие радости PHP мира тут явно не в тему.
    Ответ написан
    Комментировать
  • Как правильно установить фильтр перед всеми маршрутами в beego?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Сделай два добавления, один для /* другой для /
    Ответ написан
  • Как вы обрабатываете связи в Базе Данных в приложении на Go?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Попробуйте вообще отказаться от структур там где не нужно явно добавлять к ним методы. Ничто не мешает вам сделать столько переменных нужных типов сколько вам нужно... и оперировать ими как угодно.

    Ну или попробуйте дописать нужный механизм в sqlx, всё польза будет:)

    P.S. Знаю что топик изрядно старый, просто новых нет:)
    Ответ написан
    4 комментария
  • Какой правильный подход при записи в закрытый канал в Go?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Что бы "потушить" генератор - надо отправить ему сообщение "хватит работать". Он сможет его прочитать между итерациями и принять решение "работать ли дальше" или "не работать дальше".
    Что бы это сделать посмотри на реализацию GetCommand и GetLastCommand в файле https://github.com/mantyr/runner/blob/master/chan.go

    Это всего лишь один из вариантов реализации. Можно как-то упростить, отправлять не текст, а bool или иногда вместо "next" команды используется чтение другого канала (например time.After()) для равномерного выполнения команд по времени. Пример использования GetCommand есть в Readme https://github.com/mantyr/runner/ , GetLastCommand делает тоже самое, только пропускает все имеющиеся сообщения и отдаёт только последнее (иными словами ждёт когда все задачи в очереди выплеснуться и канал станет не занятым и только тогда возвращает последнее значение).

    Гуглить можно по теме "Golang start stop goroutines"
    Ответ написан
    Комментировать
  • Почему mysql возвращает ошибку?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Школьник, ты по одной задаче открыл тонну связанных вопросов... учись группировать данные.
    Ответ написан
  • Как сделать переменную глобальной на все пакеты в golang?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Есть такая штука, называется "инициализация". Вы в main пакете инициализируете всё что вам нужно, например:
    1. инициализируете доступ к BD
    2. инициализируете свои пакеты с бизнес логикой
    3. инициализируете другие какие-то пакеты которые вам нужны в main
    При этом при инициализации пакета которому нужен доступ к BD, вы просто передаёте ему ссылку на уже открытый дескриптор.
    package main
    import "mypackage"
    // import DB package
    
    var DB *sql.DB
    
    func init() {
       DB = sql.Open()
       mypackage.DB = DB
    }
    
    func main() {
       mypackage.myfunction1() 
       mypackage.myfunction2()
    }
    Ответ написан
    2 комментария
  • Попадёт ли статика в бинарник?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Вы про html/css/js/images? Нет, эти файлы в бинарник не попадают. Попадают только *.go файлы, как ваши, так и модулей которые вы используете у себя в коде.
    Ответ написан
    Комментировать