Ответы пользователя по тегу Go
  • Не могу загрузить пакет из приватного репозитория. Как исправить?

    Попробуй так:
    export GOPRIVATE='private.gitlab.ru/repositoryName/*'

    Затем посмотри что выводит
    go env
    go list -m all
    Ответ написан
    Комментировать
  • Как поставить приложение "на паузу"?

    Неправильно как-то все это.
    Если есть запрос, значит, и соединение. Пока ответ не отдан, веб-сервер должен держать соединение. А если ответ не возвращается, то клиент ждет, пока соединение не отвалится по таймауту. Так что эта техника довольно затратна с точки зрения ресурсов, которые могут быть исчерпаны. Особенно, при наличии достаточно большого количества клиентов.
    Ну а так, ошибка 500 может означать и логическую, и ошибку соединения с СУБД, и что какой-то ресурс 3-й стороны недоступен, и многое другое. Так что если логическая, то сервер не "исправится" и, при этом, не выйдет из спячки, если будет ждать ответа 200.
    Ну а так, блокировать выполнение можно при помощи каналов (channel). Но практический смысл в этом не вижу.
    Ответ написан
    Комментировать
  • Из-за чего, когда я конвертирую байты в строку и обратно, то байты отличаются?

    Ничего удивительного.
    В документации указано что делает %x в Sprintf.

    Если нужно убедиться в корректности в строке, то использовать strings.ToValidUTF8.
    Ответ написан
    Комментировать
  • Go get - connection refused, какие порты открывать?

    Это неверный подход и с точки зрения ИБ и разворачивания ПО.
    Для доступа к конечному серверу на Linux и разворачивания новых версий на нем достаточно лишь открытого порта для SSH, причем, необязательно 22. А собирать приложения стоит на отдельном сервере для сборки (негоже продакшн засорять всякими системами сборки). Это называется CI/CD. Ну или, хоть, на своем компьютере собирай, где хоть все порты открыты.
    При использовании внешних хранилищ для скачивания артефактов сборки типа Docker Hub или AWS ECR требуется еще и открытый порт наружу 443 на хранилище.
    Ответ написан
    Комментировать
  • Как убрать проверку импортированных модулей go с официальным расширением?

    Начиная с версии 1.11, используются Go modules.
    При этом нет необходимости использовать ни GOROOT, ни GOPATH.
    Для удовлетворения зависимостей предпочитаю использовать go mod tidy.
    Ответ написан
    Комментировать
  • Golang. Что работает быстрее strings.Contains или json.Unmarshal?

    Согласен с Александр Павлюк .
    Если хочется сэкономить на случаях, когда ответ достаточно увесистый, а достаточно лишь получить некоторые поля, тогда можно попробовать https://github.com/tidwall/gjson
    Ответ написан
    1 комментарий
  • Golang и PHP, дань моде или необходимость?

    Go обычно идет в связке с другими технологиями, производительность которых не устраивает. Если вводить Go на раннем этапе, то это скорее всего неоправдано. Так что, для некоторых - дань моде, конечно.
    Я вижу смысл начинать использовать Go когда проект довольно вырос и появились критичные места в производительности архитектуры в целом. Тогда можно написать микросервис, который решит конкретную проблему.
    Бизнес-логику на Go писать неэффективно. Но если есть какие-то инфраструктурные задачи, то на нем писать их можно на ура.
    Выбор в пользу Go делается из-за подержки языка корпорацией, большой медийной поддержки в интернете и легкости изучения основ языка из-за его простоты. Соответственно, легче найти новых разработчиков, желающих писать на нем и обучить их.
    Ответ написан
    Комментировать
  • Теоретический вопрос: можно ли запускать php скрипты и насколько такой подход правильный?

    Если я верно понял, то схема такова:

    Producer (1-й PHP скрипт) -> MQ broker -> Consumer (2-й PHP скрипт)

    Это обычная микро-сервисная архитектура. Плюс каждого сервиса в том, что каждый из них не хранит состояние. То есть, производителя "не интересует" судьба отправленной задачи и он не ведет никакого учета по тому что и кому было отправлена задача.
    Если не хочется брать тяжеловесные брокеры очереди сообщений, то можно взять как посоветовал Дмитрий Шицков или даже ZeroMQ.

    Ту же задачу можно решить при помощи создания нового потока в основном потоке программы и ожидания окончания выполнения потока, выполняющего задачу. В случае Го вместо потока создается го-рутина (просто более легковесный вариант потока) - смысл тот же.
    Чтобы не сильно нагружать систему, используют ограниченное количество потоков-потребителей.

    Добавлено
    В случае Го, если не нужно ожидать окончания, то можно отправить задание в канал. Потребители канала должны забирать задания, иначе канал может заблокироваться (по заполнению буфера канала задач или при каждой новой задаче, в зависимости от конфигурации канала).
    Ответ написан
    Комментировать
  • Как писать в канал без блокировки golang?

    Использовать (durable) очереди сообщений или буферизованный канал (указав длину канала), способный вместить достаточное количество сообщений (например, 100) Но если программа получит сигнал прерывания, то они будут утеряны. Поэтому 1-й вариант надежнее.
    а reader считывал только свежие данные.
    Если в сообщении отправлять атрибут времени отправки, то получатель может отбросить сообщение, если оно стало неактуально.
    Ответ написан
    Комментировать
  • Как сортировать в Go?

    sorter := func(i, j int) bool {
    		return arr[i] < arr[j]
    	}
    	sort.Slice(arr, sorter)
    Ответ написан
    1 комментарий
  • Где можно использовать горутины в Go?

    Задачи у всех разные. Вы работали с потоками? Это похоже на них.

    Простой пример:
    Есть 2 запроса в БД. Один длится, скажем, 3 секунд, другой 10 секунд. И нет зависимости одного от другого.
    Если выполнять их последовательно, это займет 13 секунд. Многовато. Почесав лоб, вы приходите к другому решению:
    выполнять 2 запроса одновременно, каждый запрос в горутине! Дождавшись их окончания, пройдет 10 секунд. Экономия!

    Другой пример:
    Вы работаете с очередями. В одну очередь вы отправляете команды задач, а в другой вы получаете их результаты. Разумеется, и продюсер и консюмер должны работать независимо друг от друга. Как вы запускаете их в Го?
    Правильно, двумя горутинами!
    Ответ написан
    Комментировать
  • Как задеплоить и связать два приложения на Heroku?

    https://devcenter.heroku.com/articles/how-heroku-works
    Затем в переменных окружения одного приложения указать URL другого, чтобы знало куда слать данные.
    Ответ написан
    Комментировать
  • Как правильно использовать модули Go?

    Если нужен пример как использовать локально, то можете посмотреть пример в репозиторие go-openvz-api. Это первая фиксация кода (commit), до использования go modules.
    Далее в истории фиксаций впоследствии перешел на go modules.

    main.go
    package main
    import "./package1"
    ...


    package1/file1.go
    package package1
    import (
      "fmt"
    )
    ...


    package1/file2.go
    package package1
    ...


    Если изначально применять схему именования пакета как для хранения на удаленных хранилищах, то можно сделать так:

    go mod init example.org/user/mypackage
    Это означает, что префикс при импорте в пакетах всегда будет начинаться с example.org/user/mypackage. Все что в поддиректориях проекта, при импорте должно быть указано как example.org/user/mypackage/название_подпапки (например, example.org/user/mypackage/package1).

    И важные дополнения, без которых ничего не будет работать:
    1. Проект должен располагаться вне пути GOPATH.
    2. Отредактировать go.mod, добавив строку
    replace example.org/user/mypackage => ./
    Эта инструкция укажет на локальную папку, находящуюся по тому же пути, где и корень проекта. Таким образом, go не будет искать на хостинге http: //example.org/user/mypackage

    Это сработает для Linux, где пути указаны косой чертой (точка в начале - текущая директория). В Windows используется обратная косая черта. Как в Go работают с путями в Windows - не знаю.

    То есть можно работать локально и никуда не закачивать код, будет все работать локально.
    И когда все же закачаете код на хранилище, поменяйте везде example.org/user/mypackage на истинное расположение репозитория, а строку с replace удалите с go.mod, иначе будет искать код только локально.

    Замечания:
    1. Не исключено, что название Modules.pack проблематично из-за точки внутри.
    2. . "Modules.pack/mod1"так неправильно. Точку вначале убрать
    Можно так:
    "./Modules.pack/mod1"
    или так:
    "example.org/user/Modules.pack/mod1"
    или так:
    "qqw example.org/user/Modules.pack/mod1" // а в самом коде ниже писать qqw вместо mod1


    Вместо go get использую go mod tidy.
    Сам с Go модулями не так давно работаю, но думаю что так надо.
    Ответ написан
    5 комментариев
  • Golang. Самописный пакет не видим из основного модуля?

    Или возьмите старую версию Go, как у "ютуберов", или же, наконец, начните использовать go modules.
    Ответ написан
    2 комментария
  • Насколько Golang подходит для больших проектов?

    Go часто используется как язык, на котором строят программы для оптимизации узких в плане ограничения ЦПУ / памяти мест в больших проектах. Нередко его выбирают, когда основная часть кода написана на языках с динамической типизацией и, при этом, все работает медленно и потребляет много памяти. Проще выбрать "быстрый" язык, который одним махом решит проблему и поэтому мало кто желает вкладывать силы в реструктуризацию и поиск проблемных мест в проекте.
    Так что, перед использованием Go я бы предложил для начала убедиться, что из используемой вами технологии вы уже выжали все возможное. Возможно, достаточно переосмыслить подход в построении проекта, переписать проблемные части с нуля.
    Хотел бы еще добавить, что по сравнению с тем же Ruby писанины кода куда больше. Чисто по ощущениям, раз в 3-5. Бизнес логика описывается в Go не так компактно, как в Ruby.
    Ответ написан
    Комментировать
  • Может ли Golang заменить C/C++ в написании программ для железа?

    Заменить C/C++ сможет вряд ли. Используется лишь в определенных сферах из-за своих особенностей. Может лишь немного потеснить их, по большей части в системном и прикладном ПО, а также в другом, связанным с коммуникациями.
    Проект TinyGo, к примеру, позволяет писать ПО на подмножестве Go для микроконтроллеров и WebAssembly. Не думаю, что о нем многие знают.
    Судя по всему, наиболее успешно вытесняет C/C++ язык Rust. По крайней мере, в браузерах и ядре Linux (пока лишь обсуждения) уже наметился сдвиг.
    Ответ написан
    1 комментарий
  • Как можно пройти for'ом по такому типу и можно ли?

    Можно. Попробуйте, что-ли.

    Добавлено
    *interfaces.ContactListне нужно делать указатель на массив. Массивы и так передаются по указателю.
    Достаточно так
    interfaces.ContactList
    Ответ написан
  • Почему не выводится весь текст в консоль?

    https://play.golang.org/p/9RpSsyoL4_6
    Тут в совмещенном примере оба раза выводит
    № 2
    "Орга

    Unicode - нетривиальная вещь и можно ожидать что какая-то последовательность байтов незаконна с точки зрения стандарта.

    Credits: https://gist.github.com/juergenhoetzel/2d9447cdf5c...
    Ответ написан
    2 комментария