но как будет вести себя система, когда таких горутин может быть более 10к?Для этого есть worker pool, не нужно просто так бесконтрольно запускать горутины для такого. Суть в том, что ты создаешь воркер пул, в котором определяешь число горутин, после при помощи каналов шлешь в него таски на оплату
Просмотрев несколько тестов go vs java/c++/c#, то в большинстве из них он имел самое высокое время выполнения тестаВ целом хотелось бы ссылки на тесты увидеть, т.к. можно абсолютно без проблем найти тесты которые будут показывать обратные результаты(что само собой не говорит об их корректности).
в том же сравнении с веб сервером на spring go имеет время ответа сервера (в одинаковых условиях) до 20% большее чем у javaА вот обратный пример, тут надо смотреть как и что меряется и в каких условиях. Но насчет спринга реально интересно посмотреть, в каких задачах нативный го будет медленнее спринга.
Я не могу понять что это за трэнд такой с использованием его для создания веб приложений.Из плюсов то, что го удобно собирается в один бинарник со всеми зависимостями, простой в установке. Для веба имеет удобную библиотеку, которая позволяет писать на нём без доп фреймворков. В целом по моему опыту, тем кто пишет на языках типа явы он им не очень нравится, т.к. по сути людям приходится менять стиль написания кода, а нравится больше тем, кто пишет в стиле Си. В общем если вы любите использовать много абстракций и +/- сложное ООП, то го скорее всего не зайдёт, т.к. в нём придется перестраивать мышление.
Я не могу понять что это за трэнд такой с использованием его для создания веб приложений.Ну он стал популярнее конечно чем 5 лет назад, но вакансий на нём не прям много, на текущий момент это относительно нишевый язык. Смысл в том, что людям просто нравятся разные языки, а пишут на го в основном демонов, сетевые и веб приложения, просто потому что он под них заточен
правильно ли изменять тип переменой (в данном случае id со string на uuid) в хэндлере, или это необходимо делать в сервисе?Зависит от ситуации, если без этого никак и особых проблем от смены не будет, то можно сразу в хендлере поменять. Если от этого изменения будут ломаться внешние клиенты, то тут придется уже по другому обходить эту проблему, например добавлять v2/api.
Почему некоторые решают рабоатать с бд на чистом sqlВ целом есть несколько причин:
Из нижних уровней требуется получить методы или поля структуры выше.Напрямую насколько я знаю этого сделать нельзя, как вариант можно использовать интерфейсы, но это в любом случае означает, что вам придётся писать код для каждой структуры отдельно.
Можно передавать при инициализации структур указатель на главную вглубь,Если нет веских причин для этого, то я бы не рекомендовал бы вам так делать, т.к. это делает код довольно запутанным и увеличивает вероятность ошибок в дальнейшем
resp, err := http.Get("http://example.com/")
if err != nil {
// handle error
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
tr := &http.Transport{
MaxIdleConns: 10,
IdleConnTimeout: 30 * time.Second,
DisableCompression: true,
}
client := &http.Client{Transport: tr}
resp, err := client.Get("https://example.com")
Получается так что в idleConnWait = {map[http.connectMethodKey]http.wantConnQueue} постоянно записываются новые элементы,В целом есть вероятность, что "утечка" тут, но это очень легко проверить даже без профилировщика, т.к. эта мапа уникальна для каждого клиента, то можно напрямую проверять сколько клиент занимает памяти, но на самом деле есть большая вероятность, что проблема в том, что вы неправильно используете client, т.к. эта мапа периодически очищается и расти она должна только до определенного значения
а как понять, то что перед типом указано - [4] ?В го конкретно в данном случае это будет частью типа, по сути это означает, что массив (именно массив а не слайс) - это отдельный тип, который представляет из себя последовательность из 4 элементов.
- запись в выходной канал queuedData[i]Вроде же это слайс структур fanInRecord, из каналов так только pause, видимо нужно добавить в структуру канал и туда писать, но мб я что-то не так понял
- разблокировка исходного канала с помощью pause."Какой из каналов тут исходный? Но в целом механизм паузы реализуется либо через два канала pause/unpause, либо можно использовать один канал, который будет менять значение булевской переменной, которая определяет можно ли сейчас писать в канал или нет
в 2013 на английском и только в 2016 году на русском, а это почти 10 лет назад,Глобальных измений за 10 лет было не так много, упражнения в этой книге в целом довольно интересные (если затык с ними то можно на гите поискать решения), поэтому в целом книга достаточно актуальная.
И я хочу сделать 1 модуль который они будут импортировать с некоторым набором общих для них функций.Если хотите так сделать, то можно просто сделать интерфейс, у которого методы будут совпадать с общими функциями которые вы хотите вынести, можете его вынести в отдельный файл/модуль при необходимости.
Я часа 4 ковырялся в статьях и видео уроках но так и не смог из 1 несчастного модуля импортировать функции в другой неменее несчастный модульМожно упрощенную версию сюда выложить и конкретнее написать что не получается
обновлялся счетчик отправленных сообщенийНужно отдельное API которое будет возвращать тебе значение счетчика для текущего чата, например по id чата. На стороне клиента нужно использовать js, сейчас обычно используют fetch реже XHR, соотвественно в js тебе нужно будет запустить фоновый процесс который будет опрашивать сервер раз в секунду например и обновлять счетчик
В целом можно ответить, что так решили разрабы, но в целом это логично, т.к. при присовении нового значения вы ничего не делаете с переменной, т.е. она фактически просто занимает память и не используется ни в каком выражении.
Вопрос: Почему присвоение переменной значения не считается использованием ?
value = value + 1В целом по логике этот случай тоже можно было бы отнести к неиспользованию, но вероятно тут такая логика, что это значение используется для вычисления нового значения, что по сути является использованием, компилятор не чекает используется дальше вычисленное значение но в данном случае это уже не особо и важно. В целом для обход not used есть такой способ
// No errors
a:= 1
b := 2
_, _ = a, b
Или, может быть, поделитесь опытом использования на производстве.Хз что подразуемевается под серьезным проектом. На практике их получается не так часто использовать. Например изнально была функция, которая на вход получала слайс и преобразовывала его в таски и помещала в пул , потом добавилось несколько других источников данных, с которыми нужно было тоже самое делать. В целом форматы данных отличались, но всё можно было преобразовать к общему формату. Выделил общие методы и использовал дженирики. В целом можно было бы обойтись и без них, но в моей ситуации это было довольно удобно, по сути можно было бы заменить интерфейсом.
Гугл с ошибкой не помог :(
sql: Scan error on column index 1, name "i_size": converting driver. Value type int64 ("-10") to a uint8: invalid syntaxМожно попробовать еще прочитать ошибку или засунуть ее в гугл переводчик.
структура, которая будет использоваться во множестве других пакетов(например, отправка отп кода через email или смс).Это можно вынести либо в отдельный проект, либо помещать такое в папку pkg, в которой обычно и лежат переиспользуемые пакеты.
Где правильно хранить интерфейс с методами этой структуры?Создайте отдельный пакет в том месте где вам удобно, главное чтобы не получилось циклических зависимостей в будущем. Конкретно для вашего случая, можете поискать как реализуют фабрику в го, мне кажется это должно вам помочь.