• Как узнать когда горутины закончили запись, чтобы закрыть канал?

    WinPooh32
    @WinPooh32
    Stack Overflow answer searching expert
    Предлагаю не злоупотреблять каналами:
    https://goplay.tools/snippet/a91nAx2wevG

    Ваш тест из вопроса проходит. Корректность теста не смотрел :)
    Ответ написан
    Комментировать
  • Как удалить запись в таблице через 7 дней?

    WinPooh32
    @WinPooh32
    Stack Overflow answer searching expert
    Храните дату создания записи и просто при выборке исключайте строки, которые старее 7 дней относительно времени запроса.

    Еще небольшой вопрос. Если все-таки такое сделать возможно, то будет ли это сильно нагружать БД, скажем так, примерно, при 10'000 записях?

    10к это очень маленькое количество записей. На таком объеме не будет заметно.
    А вот если у вас сотни тысяч вставок и удалений, то фризы гарантированны.
    Ответ написан
    1 комментарий
  • Почему не видит пакет race?

    WinPooh32
    @WinPooh32
    Stack Overflow answer searching expert
    Если устанавливали по инструкции с сайта, то удаляйте все что напихали в систему. Потом нужно установить компилятор через менеджер пакетов.
    Например, для debian/ubuntu через apt:
    sudo apt install golang
    Либо через snap:
    sudo snap install go --channel=1.16/stable --classic
    Ответ написан
    Комментировать
  • Как организовать тесты в пакетах вида адаптер?

    WinPooh32
    @WinPooh32
    Stack Overflow answer searching expert
    Проблема в том что эти адаптеры имеют одни и те же методы, делают одно и тоже (но по своему),

    Это заворачивается в интерфейс и тестируете по этому интерфейсу ваши конкретные реализации.
    https://gobyexample.com/interfaces

    пример repo_test.go:
    type Repository interface{
        MethodA() error
        MethodB() error
    }
    
    func TestRedis(t *testing.T) {
         testRepo(t, NewRedis(...))
    }
    
    func TestMongo(t *testing.T) {
         testRepo(t, NewMongo(...))
    }
    
    func testRepo(t *testing.T, repo Repository){
        err := repo.MethodA()
        if err != nil {
            t.Errorf("methodA: %s", err)
        }
    
        err = repo.MethodB()
        if err != nil {
            t.Errorf("methodB: %s", err)
        }
    }


    ... но тут проблема с цикличным импортом (все адаптеры импортируют компоненты из repo).

    Но тут можно только посочувствовать.
    Самое простой выход из ситуации - это отдельный пакет, в котором будут тестироваться интерфейсы по схеме, которую я выше описал.
    Ответ написан
    Комментировать
  • Python или C++?, что перспективнее?

    WinPooh32
    @WinPooh32
    Stack Overflow answer searching expert
    Какой язык с наибольшей вероятностью будет востребован через условные лет 5?

    Не важно.

    Какой язык выбрать чтобы потом извлечь из него наибольшую выгоду?

    Тоже не важно.

    Востребованы всегда будут алгоритмы, математика, архитектура, ну и шаблоны проектирования .

    Языки программирования это лишь инструменты для реализации этих штук. Поэтому нужно выбирать тот язык, который будет адекватен решаемым задачам и предметной области.

    А для обучения я бы не советовал начинать с языков с динамической типизацией (python, js ...) и со слабой типизацией (C/C++).

    В случае с питоном у вас будет сильное недопонимание того, что происходит под капотом, когда реализуете ту или иную конструкцию.
    А с С++ просто захлебнетесь, изучая все его фичи. Си - сильно низкоуровневый, неплох для первого языка, но слишком многое в нем допускается, из-за чего нужна сильная дисциплина при разработке (актуально и для c++).

    Не просто так в школах и университетах начинают с изучения Паскаля, т.к. он со строгой и сильной типизацией одновременно, что не позволяет творить всякий бред. Но минус его в том, что у него архаичный синтаксис и он стремительно теряет свою популярность (редко кто начинает новый проект на нем).
    Из современных языков с подобными параметрами, которые я знаю, - Go. Но модель управления памятью у него неочень для первого языка (сборщик мусора).

    И не нужно зацикливаться на одном языке - расширяйте свой кругозор, изучая по очереди или одновременно разные ЯП :)
    В идеале такая цепочка изучения для хорошего понимания: pascal -> go -> c -> c++ -> js/python
    Также не стоит забывать про Java, C#.
    А если захочется хардкора, то есть Haskell, Rust и т.д.
    Ответ написан
    Комментировать
  • Не определены стандартные пакеты Golang?

    WinPooh32
    @WinPooh32
    Stack Overflow answer searching expert
    Никогда не устанавливайте программы вручную в корень системы, как в вашей инструкции. Почти всегда есть готовые пакеты. Лучше уже через докер ставить, лезть в систему - крайний случай.
    (и советую все вернуть как было до ручной установки)

    Го лучше поставить через snap (а вот vscode лучше через deb с сайта):
    sudo snap install go --channel=1.16/stable --classic


    Когда понадобятся другие версии, VScode может сам установить в папку желаемую версию и будет использовать её:
    ctrl+shift+p, вводите Go: Locate Configured Go Tools (или на панели снизу можно найти кнопку).

    Бывает что анализатор может заглючить и перезапуск gopls помогает: ctrl+shift+p, Go: Restart language Server

    И убедитесь, что го расширение установлено в редактор.
    Ответ написан
    Комментировать
  • Есть ли простой способ передать задачу в Go?

    WinPooh32
    @WinPooh32
    Stack Overflow answer searching expert
    Пример замыканий:
    package main
     
    import (
        "fmt"
        "math/rand"
        "time"
    )
     
    type kelvin float64
     
    func measureTemperature(samples int, sensor func() kelvin) { // measureTemperature принимает функцию в качестве второго параметра
        for i := 0; i < samples; i++ {
            k := sensor()
            fmt.Printf("%v° K\n", k)
            time.Sleep(time.Second)
        }
    }
     
    func fakeSensor() kelvin {
        return kelvin(rand.Intn(151) + 150)
    }
     
    func main() {
        measureTemperature(3, fakeSensor) // Передает название функции другой функции
    }

    Источник
    Ответ написан
    2 комментария
  • Как огрганизовать хранение нескольких value в boltdb и поиск по ним?

    WinPooh32
    @WinPooh32
    Stack Overflow answer searching expert
    И при каждом запросе перебирать каждый элемент, сравнивать по полям структуры с нужными данными?

    bolthold

    Будет ли это быстро когда база вырастит до 10 000 полей.

    Нужно смотреть конкретно в ваших задачах.

    В пользу SQLite можно отнести поддержку sql запросов, что позволяет использовать стандартные подходы к построению базы данных. Например, можно воспользоваться маппером sqlx или gorm.
    Ответ написан
    Комментировать
  • Как добавлять в clickhouse только уникальные primary key?

    WinPooh32
    @WinPooh32
    Stack Overflow answer searching expert
    Если используется MergeTree в качестве движка таблицы, то устранить дубликаты можно удалением через ALTER (блокирует весь кластер), либо только фильтрация во время запроса.

    Для симуляции мутабельности есть VersionedCollapsingMergeTree, но тут также есть нюансы - дубликаты удаляются не сразу и все равно требуется фильтрация во время запроса.

    Просто для удаления дубликатов можно использовать CollapsingMergeTree, но выбор строки недетрменирован и тоже нужна фильтрация, т.к. удаление происходит асинхронно в фоновом режиме.
    Ответ написан
    1 комментарий
  • Какой сервис использовать для ведения анкет персонажей разрабатываемой RPG?

    WinPooh32
    @WinPooh32
    Stack Overflow answer searching expert
    возможно, вам помогут mind-map диаграммы.
    неплохой условно бесплатный сервис https://coggle.it/
    для примера диаграммка

    еще есть бесплатный офлайн редактор freemind
    Ответ написан
    Комментировать
  • Не могу разобраться со структурами в С++. Как решить задачу?

    WinPooh32
    @WinPooh32
    Stack Overflow answer searching expert
    string Name[n];

    Зачем вам массив строк? std::string уже внутри сам управляет массивами.

    Раз у вас c++, то используйте только std::string (массивы чаров обычно понадобятся для взаимодействия с Си-шными библиотеками).

    struct info {
        std::string Name;
        int H;
        char Sex;
    };


    В качестве структуры для хранение возьмите std::vector.
    Пример работы с ним в вашем случае:
    std::vector<info> people;
    info man = WriteStruct(info);
    people.push_back(man);

    Пройти по массиву можно вот так:
    for (int i = 0; i < people.size(); i++) {
       info man = people[i];
    }


    upd: WriteStruct следует переименовать в ReadStruct, т.к. это названее лучше описывает происходящий в ней процесс.
    Ответ написан
    3 комментария
  • Go под Android?

    WinPooh32
    @WinPooh32
    Stack Overflow answer searching expert
    Из коробки все компилируется:
    GOOS=android GOARCH=arm GOARM=7 go build

    И джавы вообще никакой не надо, как и графической оболочки :)
    Лучше вообще на Го забыть про всякие там новомодные gui - только консоль, только хардкор.

    Если так хочется как можно больше на Го сделать, то решением может быть библитека на нем, а фронт на нативных технологиях: Java/Kotlin или Dart.

    Еще есть вариант в виде привязки к Qt, логику можно писать на Го, графику на QML. Только вот придется весь набор Qt либ тянуть с собой, да и ограничения в лицензировании продукта есть.
    Ответ написан
    7 комментариев
  • Как изменить двумерный массив в for?

    WinPooh32
    @WinPooh32
    Stack Overflow answer searching expert
    ....  
     for i, _ := range arr {
        arr[i] = append(arr[i], "ddddd")
      }
    ....

    В вашем случае innerArray это срез, который внутри содержит указатель на массив, но когда вы делаете append и при этом size выходит за пределы capacity, то выделяется новый массив и в него добавляется новое значение.

    К тому же innerArray это локальная переменная в виде среза, которая доступна лишь в пределах цикла.
    Присваивая новое значение в нее из append() вы не меняете значение переменной среза в массиве, а новый срез из аппенда уже указывает на другой массив с добавленным элементом.
    Ответ написан
    Комментировать
  • Во что конвертировать огромный, сотни ГБ, CSV-файл для максимально быстрого чтения по «ключу»?

    WinPooh32
    @WinPooh32
    Stack Overflow answer searching expert
    Встраиваемое kv-хранилище от гугла - leveldb вам в помощь. Обертки есть почти под каждый популярный ЯП.

    leveldb используется для хранения транзакций в клиенте биткоиана, а там уже, на минуточку, объем БД перевалил за 200 гигов.

    Только учитывайте, что магии не будет, когда БД в RAM не вмещается, и боттлнек будет на дисковой подсистеме. Сильное ускорение будет давать быстрый ssd, особенно который nvme через pci.
    Поэтому на частые запросы обмазываемся кэшами и, возможно, радуемся.

    Т.к. это встраиваемое хранилище, то всю сетевую обвязку придется реализовывать самому.
    Ответ написан
    6 комментариев
  • Как программно уйти от ошибки key too large to index в pymongo python?

    WinPooh32
    @WinPooh32
    Stack Overflow answer searching expert
    Костыльным решением вашей проблемы будет хеширование.
    1) Перед вставкой хешируете свои ключи c помощью некритографического алгоритма.
    2) При поиске по ключу делаете то же самое.

    При таком походе есть вероятность подорваться на коллизиях. Можно умешить вероятность, сделав составной ключ.

    Очевидно, что для ключа потребуется новое поле.
    А лучше выберете более адекватные атрибуты в качестве ключа.

    UPD: у монги есть индексы на хешах.
    Ответ написан
  • Как спарсить строку и изменить определённые символы?

    WinPooh32
    @WinPooh32
    Stack Overflow answer searching expert
    Без регулярных выражений:
    https://play.golang.org/p/SIqQunrMQHI
    import (
    	"strings"
    )
    
    func normalize(s string) string {
    	var sb strings.Builder
    
    	for _, r := range s {
    		switch {
    		case '0' <= r && r <= '9':
    		case r == '+':
    		default:
    			continue
    		}
    		sb.WriteRune(r)
    	}
    
    	return sb.String()
    }


    С регeлярками:
    https://play.golang.org/p/GYzsCTaEa9W
    import (
    	"regexp"
    	"strings"
    )
    var re = regexp.MustCompile(`(?i)[\d\+]+`)
    
    func normalize(s string) string {
    	var sb strings.Builder
    	subs := re.FindAllStringSubmatch(s, -1)
    	
    	for _, sub := range subs {
    		sb.WriteString(sub[0])
    	}
    	
    	return sb.String()
    }


    Или вариант с заменой сиволов:
    var re = regexp.MustCompile(`(?m)[^+\d]`)
    var str = `+999 (99)-999 9999`
    fmt.Println(re.ReplaceAllString(str, ""))


    Версия без регулярок более экономна по ресурсам процессора и памяти, но при изменении паттерна потребует изменения и кода функции.
    Ответ написан
    Комментировать
  • Как передать unsigned char* байты в signed char*массиве?

    WinPooh32
    @WinPooh32
    Stack Overflow answer searching expert
    1.Вкратце читаю uchar[] в char[]

    Так нельзя делать, неудивительно, что данные искажены.

    Хоть и uchar, и char занимают одинаковое количество байт (1 шт в данном случае), но у char 1 бит занят под знак, рассматривая uchar как обычный char, вы получите мусор в случае выхода за границы значений char, т.е. числа больше 127 будут некорректными.

    Как это исправить?

    Используйте везде только uchar или char.

    А вообще при всех ваших махинациях все корректно должно быть, косяк где-то в этих местах: "Вкратце читаю...", "Передаю методом send(char[])", "Принимаю методом", "Записываю char[] как uchar[]"
    Ванги в отпусках и без кода нечего сказать.
    Ответ написан
  • Как сделать обязательным указание одного из двух полей protobuf?

    WinPooh32
    @WinPooh32
    Stack Overflow answer searching expert
    Oneof

    Да и к Go вопрос никак не относится.
    Ответ написан
    Комментировать
  • Как бюджетно реализовать распределенный сервер БД?

    WinPooh32
    @WinPooh32
    Stack Overflow answer searching expert
    Сравнение репликаций в документации postgresql

    Судя по всему вам нужна асинхронная репликация master-master.
    Это можно реализовать с помощью Bucardo
    Ответ написан
    2 комментария
  • Нужно составить небольшую программу на GO которая отправляет данные в базу данных PostgreSql?

    WinPooh32
    @WinPooh32
    Stack Overflow answer searching expert
    Если собираетесь изучть SQL, то не советую начинать с использования ORM библиотек.

    Для упрощения работы с sql-запросами в Го есть такие инструменты, которые облегчат жизнь:
    • sqlc - генерирует всю обвязку обращений к БД на основе sql-запросов в виде Го-кода.
    • sqlx (дока с примерами) - библиотека для упрощения работы с запросами. Например, автоматический маппинг из результата в go-структуру.
    Ответ написан
    Комментировать