• Как выполнить действие через промежуток времени, который может измениться?

    @ivahaev
    Программист, связист и просто хороший человек
    В дополнение к решению Алексея, предложу ещё вариант, который применяю лично я для удаления протухших сессий:
    Т.к. высокая точность не требуется, то раз в минуту я просто перебираю все сессии, смотрю на время последнего обращения, и если прошло больше установленного времени, то сессию прибиваю. Соответственно, при каждом обращении за сессией, поле LastRequest устанавливается на текущее время.
    Ответ написан
    2 комментария
  • Как в го реализовать полифоризм?

    @ivahaev
    Программист, связист и просто хороший человек
    Как я понимаю, в пакете должен быть описан некий интерфейс для СУБД. Если нужно добавить поддержку новой базы, то её драйвер должен будет реализовать этот интерфейс.

    Например, у Стива есть пакет aerofs – абстрактная файловая система. Для поддержки новой ФС пишется структура, реализующая соответствующие интерфейсы, и подключается к пакету.
    Ответ написан
    Комментировать
  • Как вшить ключ?

    @ivahaev
    Программист, связист и просто хороший человек
    Если имелось ввиду "во время запуска компиллятора", то вот так, например, я прописываю время сборки и короткий хэш гит комита:

    go build -ldflags "-X main.buildTime=`date +%Y-%m-%d:%H:%M:%S` -X main.gitHash=`git rev-parse --short HEAD`"


    Собственно, в пакете main устанавливаются две переменные buildTime и gitHash. Дальше я вывожу их, в том числе, по ключу -v, т.е. в отображении версии.
    Во время запуска модифицировать бинарник как-то странно...
    Ответ написан
    Комментировать
  • Как достучаться до метода через __proto__?

    @ivahaev
    Программист, связист и просто хороший человек
    Удалить эту строчку
    self.__proto__.parent_func(); // <- TypeError: self.__proto__.parent_func is not a function
    Ответ написан
    Комментировать
  • Как писать unit-тесты для крупного приложения на go?

    @ivahaev
    Программист, связист и просто хороший человек
    Есть несколько подходов.
    Один из них – тестировать только публичные методы пакетов, а файлы тестов держать в корне проекта.

    Второй, и, мне кажется, более правильный – снижать связанность пакетов. Методы делать проще и более абстрактными, чтобы их было легче тестировать.
    Ответ написан
    2 комментария
  • Почему мой код паникует неужели он не может спокойно работать?

    @ivahaev
    Программист, связист и просто хороший человек
    Здесь явное злоупотребление каналами. Я бы даже сказал, что не правильное их использование. Если получая из канала сообщение, тут же запускаешь горутину, то какой смысл в канале? Можно сильно упростить, убрав канал и переделав на вызов функции.
    Парсинг сделать бы вот с этой штукой WaitGroup. Собрать все ссылки и только потом писать в мапы. И вот тут-то и нужен локер для конкретной мапы, ну или так же через канал можно реализовать.

    Что касается паники в текущей версии, похоже, что происходит в момент считывания мапы в функции ReplacationFileSystem. Никакого локера там нет. В это же время другая рутина может писать в эту же мапу.
    Ответ написан
    Комментировать