Егор
Вхахахах
Никита
Почему все говорят, что го дерьмо а раст супер?
потому чтов Rust школоты нет. Слишком высокий порог вхождения по сравнению с Go . Также нет GC. По сути C с предохранителем от выстрела в ногу. ну и еще куча всего. Но языки слишком разные
Sanity = nil
😎
Кіт ✙
чем всем GC не угодил?
проблемы с производительностью
Кіт ✙
ему ж приходится останавливать выполнение всей программы, чтобы очистить мусор. Так ещё и для имплементации сложна
Артем
у го джиси быстрый очень
Кіт ✙
anhckie
проблемы с производительностью
понимаю, но упрощает разработку. и разве производительности гоу не хватает в его задачах?)
Кіт ✙
у го джиси быстрый очень
собирает-то он мусор быстро, но его вызов всё ещё не бесплатный
Кіт ✙
понимаю, но упрощает разработку. и разве производительности гоу не хватает в его задачах?)
ну производительности и питону хватает, там при желании тоже хорошие цифры выжать можно. Но мы ведь все стремимся к идеалу
Vladislav
https://betterprogramming.pub/http-server-performance-nodejs-vs-go-397751e8d275
Илья
а как именно?
https://tip.golang.org/doc/gc-guide Пункт Latency
Кіт ✙
кстати поздравьте меня я понял, где у меня память течёт
Кіт ✙
горутина, падла, не завершается!
Даниил
Например в цикле мы можем для каждого файла вызывать функцию обработки одного файла, которая внутри себя будет ловить панику, на основании которой возвращать err или что-то нормальное.
Т.е. разделяем ответственность функций, грубо говоря - функция обхода файла получает на вход путь к файлу и номер строки, с которой начинать, через панику возвращаем значение иттерируемой переменной (если это возможно), или через замыкание из main как то отслеживаем(над этим еще подумаю), ловим панику восстановлением, возвращаем функции номер следующей строки и тот же путь. Таким образом продолжаем выполнение функции в условиях поставленной учебной задачи. И еще небольшой вопрос. В функции, для работы над строками файлов, используется пакет bufio, файл загружается в Scanner, обход по строкам Scan(), приведение к строке Text(). Вывод тоже буферизированный, вывод с дополнительными пояснениями к полям файла собирается в Builder и выгружается String, записываясь в другой файл. Вопрос - в случае паники, выгружается ли из памяти та функция с кучей буферов, которая аварийно завершилась? Будут ли проблемы с памятью в этом случае?
G
Т.е. разделяем ответственность функций, грубо говоря - функция обхода файла получает на вход путь к файлу и номер строки, с которой начинать, через панику возвращаем значение иттерируемой переменной (если это возможно), или через замыкание из main как то отслеживаем(над этим еще подумаю), ловим панику восстановлением, возвращаем функции номер следующей строки и тот же путь. Таким образом продолжаем выполнение функции в условиях поставленной учебной задачи. И еще небольшой вопрос. В функции, для работы над строками файлов, используется пакет bufio, файл загружается в Scanner, обход по строкам Scan(), приведение к строке Text(). Вывод тоже буферизированный, вывод с дополнительными пояснениями к полям файла собирается в Builder и выгружается String, записываясь в другой файл. Вопрос - в случае паники, выгружается ли из памяти та функция с кучей буферов, которая аварийно завершилась? Будут ли проблемы с памятью в этом случае?
Омг, не надо передавать значения через панику
🅞leksiy
G
У вас есть возврат ошибок для ошибок. У вас есть каналы для передачи значения между горутинами и/или контекстами.
Sharifzoda
Вечер добрый. Я хочу проект написать, но в рамках курса не учил конфиг. Как мне наверстать это и какие материалы использовать для этого?
Илья
конфиг это просто чтение файла и его парсинг в структуру
Sharifzoda
Но порядок и стиль написания я не знаю
Roman
Но порядок и стиль написания я не знаю
https://dev.to/koddr/let-s-write-config-for-your-golang-web-app-on-right-way-yaml-5ggp
Даниил
Омг, не надо передавать значения через панику
Да, я понимаю, это достаточно очевидно, но я выше писал, что это такая учебная задача.
G
Привет ребят! Маленький вопрос - есть ли какие то флаги возникновения паники в функции? В одном из учебных материалов, есть небольшая подзадача, чтобы при панике выводилась строка обхода файла, на парсинге которой эта паника произошла. Обнаруживать панику условием(условный пример): if recovery() != nil { fmt.Println("parse error on string", i) panic("parse error") } считаю неверным. Это как то неправильно, восстанавливать панику и сразу ее объявлять. Как можно определить возникновение в функции паники помимо такой конструкции? =)
В рамках учебной задачи - запишите номер строки файла в значение паники. Паника же может быть строкой. Вот и сделайте panic("I fucked up at line 123"); Но вообще не надо для этого юзать паники, юзайте ошибки. Если ошибка теоретически возможна и является частью процесса, то делайте её именно ошибкой, а потом обрабатывайте эту ошибку в зависимости от типа. Восстанавливайтесь, например, пропускайте, прерывайте процесс чтения, логируйте и вот это всё. Паника - это когда произошло что-то, что вы вообще не ожидали и не могли предвидеть. В большинстве кейсов это будет не ваш случай.
G
Порождать паники - в 99% случаев прерогатива рантайма или глубин системных библиотек. В прикладном коде не надо этого.
Илья
На языке фактов общаетесь?
Vladislav
порождаю паники в прикладном коде, когда фэйлится какой-то assertion
Илья
а для кого require придумали?
Илья
они же фейлятся
Vladislav
Илья
какой реквайр?
ну это как ассерты, но фейлят тесты
Vladislav
я не в тестах
Vladislav
в прям в коде
Vladislav
у есть меня лицензия на использование panic() где я захочу
G
порождаю паники в прикладном коде, когда фэйлится какой-то assertion
Если assertion как средство контроля инвариантов в рантаймеч например, то это как раз про "что-то неожиданное, не являющееся частью процесса". Если юзверь, например, забыл кавычку в csv закрыть - это вполне штатная ситуация и должна выражаться как ошибка, а не как паника. Я про это.
Даниил
В рамках учебной задачи - запишите номер строки файла в значение паники. Паника же может быть строкой. Вот и сделайте panic("I fucked up at line 123"); Но вообще не надо для этого юзать паники, юзайте ошибки. Если ошибка теоретически возможна и является частью процесса, то делайте её именно ошибкой, а потом обрабатывайте эту ошибку в зависимости от типа. Восстанавливайтесь, например, пропускайте, прерывайте процесс чтения, логируйте и вот это всё. Паника - это когда произошло что-то, что вы вообще не ожидали и не могли предвидеть. В большинстве кейсов это будет не ваш случай.
Вот такие вот материалы. Там странно поставлен курс, сначала паники, потом ошибки. Самостоятельное изучение и применение библиотек os и bufio в первых лекциях о основах языка и типах структур. Никакая работа с файлами, буферизацией, работой с ос и т.д. даже близко не была рассмотрена - в общем в духе старых книжек по турбо паскалю 😂 на это жаловаться - грех, таков путь 😂 Вопрос о дальнейшей проходке, после паники, это уже просто расширение задачи и экспериментаторство. Основная задача - вернуть номер строки с подписью. Однако, паника принимает строку(может и ещё что-то, пока не разобрался и буду дальше разбираться уже завтра). Вопрос как вывести именно номер строки, на которой произошла паника? Вот я и предполагал. Либо через замыкание следить, либо делать какую-то отложенную функцию в цикле анализа строки с перехватом паники, выведения через печать подписи и строки - иттерируемой в цикле анализа переменной - далее снова вызов паники и схлопывание приложения. Передать через панику, если это возможно. И т.д. Инструментарием ошибок пользоваться нельзя, потому что они "ещё не изучены" - это следущая лекция раздела. Вот и думаю.
Даниил
Т.е. разделяем ответственность функций, грубо говоря - функция обхода файла получает на вход путь к файлу и номер строки, с которой начинать, через панику возвращаем значение иттерируемой переменной (если это возможно), или через замыкание из main как то отслеживаем(над этим еще подумаю), ловим панику восстановлением, возвращаем функции номер следующей строки и тот же путь. Таким образом продолжаем выполнение функции в условиях поставленной учебной задачи. И еще небольшой вопрос. В функции, для работы над строками файлов, используется пакет bufio, файл загружается в Scanner, обход по строкам Scan(), приведение к строке Text(). Вывод тоже буферизированный, вывод с дополнительными пояснениями к полям файла собирается в Builder и выгружается String, записываясь в другой файл. Вопрос - в случае паники, выгружается ли из памяти та функция с кучей буферов, которая аварийно завершилась? Будут ли проблемы с памятью в этом случае?
И ещё может кто знает, что там по поводу буферов после паники?
Илья
при паниках все деферы выполняются не забудь просто defer buf.Flush()
G
при паниках все деферы выполняются не забудь просто defer buf.Flush()
А gc разве сам его не соберёт, если не делать Flush?
Илья
я не помню, о каком буфере была речь
Илья
Т.е. разделяем ответственность функций, грубо говоря - функция обхода файла получает на вход путь к файлу и номер строки, с которой начинать, через панику возвращаем значение иттерируемой переменной (если это возможно), или через замыкание из main как то отслеживаем(над этим еще подумаю), ловим панику восстановлением, возвращаем функции номер следующей строки и тот же путь. Таким образом продолжаем выполнение функции в условиях поставленной учебной задачи. И еще небольшой вопрос. В функции, для работы над строками файлов, используется пакет bufio, файл загружается в Scanner, обход по строкам Scan(), приведение к строке Text(). Вывод тоже буферизированный, вывод с дополнительными пояснениями к полям файла собирается в Builder и выгружается String, записываясь в другой файл. Вопрос - в случае паники, выгружается ли из памяти та функция с кучей буферов, которая аварийно завершилась? Будут ли проблемы с памятью в этом случае?
ну если вы читаете из файла, то достаточно добавить в дефер закрытые файла сразу после его открытия f, err := file.Open() if err != nil {} defer f.Close()
Илья
сканнер это просто буффер с байтами, за него волноваться не нужно (почистит сборщик мусора)
G
при паниках все деферы выполняются не забудь просто defer buf.Flush()
Flush выведет в файл то, что было в буфере перед паникой. Память-то высвободится, но и запись произойдёт. Исходите из того, нужна вам запись содержимого буфера в файл при панике илм нет.
Илья
а обработка ошибки закрытия файла где?
ну это закрытие дескриптора, с файлами не так важно как с сетевыми запросами, но я бы обрабатывал
Илья
как вообще лучше всего обрабатывать в дефере?
Илья
func do() (err error) { defer func() { if cerr != nil { err = ......... } }()
Илья
я использовал пакет multierrors от убера, какие есть альтернативы?
Кіт ✙
вот есть https://github.com/errantmind/faf-http-date а есть что-то аналогичное для го по части производительности?
Даниил
Спасибо за ответы =)
Dan
в golangci-lint есть линтер которые проверяет наличие пустой строки в конце файла?
Илья
но он следит за всеми пустыми строками в файлах
whois
Друзья,а как называется в го эта операция: (*reflect.StringHeader)(unsafe.Pointer(&a)) ???
whois
приведение типа
А я думал, приведение типа это: myVar.(string)
Dmitry
whois
Это да... Просто синтаксис такой редко использую. Вот и вызывает недоумение. В каких кейсах его можно заюзать, кроме балавства с unsafepointer
Dmitry
еще это похоже на приведение типов из си
Sanity = nil
Белая тема?😂
kostyaBro
Белая тема?😂
Кстати на пляже без нее никуда. Сижу на теме material sandy beach на морьке. А дома gruvbox
kostyaBro
К слову об удалёнке, как вам такой вайб?
kostyaBro
А я думал, приведение типа это: myVar.(string)
Так будет если myVar это interface{}
kostyaBro
Нереалистично
Маки держат зарядку весь рабочий день так что вполне себе
kostyaBro
И я из тех кто захапал себе симку yota с бесконечным интернетом, такчто все реалистично)
kostyaBro
Это да... Просто синтаксис такой редко использую. Вот и вызывает недоумение. В каких кейсах его можно заюзать, кроме балавства с unsafepointer
На самом деле у меня был код в котором много кастов байтов к строке и обратно. Причем строки могли быть по мегабайту. Я использовал unsafe cast для скорости, было оправдано. Нафиг мне лишняя аллокация
kostyaBro
Чет раз речь зашла о unsafe. Както я решил биться с компилятором и замутейтить приватную переменную. reflectом так нельзя, но арифметикой указателей вышло)
kostyaBro