Andrey
Но круды это 80% задач для джунов-мидлов)
в том отчасти и проблема, что миддлы их пишут. я вообще заметил, что сейчас с миддла прыгнуть в тимлиды вообще изи, а потом ты увольняешься, ищешь работу как сеньор, и люди удивляются, что это их так на собесах разносят, ведь они крутые специалисты
Maria
вообще, простота языка, по крайней мере для изучающих, как мне кажется, в существенной мере определяется тем, насколько хорошо написана документация. Документацию тоже хвалят (и в принципе, туториалы на go.dev/tour довольно приятные, но всё же некоторые вопросы освещены слабовато, и от этого впадаю иногда в ступор...) А вот эту спецификацию go.dev/ref/spec совсем сложно читать...
Eugene
а спека не особо и создана для чтения, мне кажется это уже лишнее)
Maria
ну просто вот конкретно "литералы" иногда не поясняются в гоу-туре нормально (на каком месте что написано), потому и полезла, но без толку
Andrey
я даже не помню, чтобы мне приходилось их где-то писать))
Andrey
но вот что интереснее, многие разработчики не особо понимаю разницу и необходимость, между errors Is/As
Ваня Гречка
и получить год опыта работы
Ваня Гречка
Дальше ты хоть кем угодно можешь быть
Emin Zalaev
Eugene
хочу быть Эмином
Emin Zalaev
Только одно место и оно забронировано
Eugene
тогда Жемином
Emin Zalaev
Ааххаха
Emin Zalaev
Звучит как корень лечебный
Eugene
rm -fr /
Eugene
вот лечение корня
Anonymous
rm -fr /
rm -rf /*
Segmentation
rm -rf /*
Without sudo?
ILIA
Ну мы же вроде сейчас находимся в чатике Го и про него говорим.
https://0xcf9.org/2021/06/22/embed-and-execute-from-memory-with-golang/ Пока из похожего нашел это.
Andrey
https://0xcf9.org/2021/06/22/embed-and-execute-from-memory-with-golang/ Пока из похожего нашел это.
если ты правда хочешь так извратится, то тогда копай в строну RCE
ILIA
если ты правда хочешь так извратится, то тогда копай в строну RCE
Я думал как решить проблему обновлений просто. У меня есть небольшие бинарники, которые могут запускаться только там, где есть интернет. Думал сделать маленький бинарник, который качает актуальную версию и её выполняет на машине. Затем при следующем запуске, он опять тащит последней версии бинарник и его исполняет. Трафик и нагрузки можно считать нет, прост кажется очень интересным решением.
Andrey
а если я как разработчик хочу сидя в деревни без интернета хочу работать, но моя работа встает, потмоу что я не могу скачать этот бинарник
ILIA
Т.е. вариант проверки, скачивания и запуск дочернего бинарника - возможен, и наверное пока сделаю так. Просто казалось интересной концепцией.
ILIA
а если я как разработчик хочу сидя в деревни без интернета хочу работать, но моя работа встает, потмоу что я не могу скачать этот бинарник
Смотри, представь, что этот бинарник выполняет какую то прямую работу в интернете. Прям как любой сетевой демон. Например проверяет код ответа у списка адресов по http и если там не 200, отправляет алерт.
ILIA
Да, ок. Ты разработчик без интернета, но тебе не нужен это приложение там, где нет интернета
Andrey
Да, ок. Ты разработчик без интернета, но тебе не нужен это приложение там, где нет интернета
просто я до сих пор не понимаю, что ты там пишешь, оставляю дырку, что если без инате ничего не выполняется
ILIA
просто я до сих пор не понимаю, что ты там пишешь, оставляю дырку, что если без инате ничего не выполняется
Что пишешь?| маленькие программы, для автоматизации ручной работы. Например для SEOшников. Есть документ с URL и ссылкой которой должна быть на этой странице. И на выходе программа напишет список страниц - на которых нет этой ссылки. В планах добавить многопоточность и работу через прокси. Поэтому после того, как я добавлю это, всем нужно будет скачать новую версию программы. Логично? А таким образом я это исключаю из ручных действий.
ILIA
оставляю дырку, что если без инате ничего не выполняется | Этого я к сожалению не понял.
ILIA
Возможно, дырку в том, что вместо моей новой версии, можно подложить любой бинарник?
Andrey
Возможно, дырку в том, что вместо моей новой версии, можно подложить любой бинарник?
то что без интернета это не работает. Но а если честно, я толком не могу понять, что ты там такое делаешь. Так что могу пожелать только удачи. за найденную инфу спасибо, почитаю
Segmentation
Слушайте, а как бы в одну строку сделать так: valueStr || "defaultStr"? Типо если строка пустая, то используй другую строку
Andrey
Он вернул аву
ахахахах, за мной следят)
Emin Zalaev
Как то надо же захантить…
Andrey
Он вернул аву
да слушай, ты меня озадачили. я то видел свою аву, и не убирал ее. полез в настройки а там почему-то выбран пункт показывать аватарку только контактам
Andrey
я за это время тут не особо активным был) да и телефон менял, может быть как раз там эти настройки приватности и проставились
Segmentation
А почему прям хочется в одну строку?
Потому что надо строку красивую сформировать в зависимости от компонентов
ILIA
Покажи код шире, плз
Segmentation
Покажи код шире, плз
Я уже плюнул и забил на красоту, сделал тяп ляп
chmod ugo-rwx
Слушайте, а как бы в одну строку сделать так: valueStr || "defaultStr"? Типо если строка пустая, то используй другую строку
Решил погуглить, как решить твою проблему с помощью ТО, а потом для себя открыл, что их в go нет, печаль
Aleksandr
лучше исключать ветку else тоже - n = falseVal if expr { n = trueVal }
chmod ugo-rwx
лучше исключать ветку else тоже - n = falseVal if expr { n = trueVal }
Тк мы делаем проверку, перезаписывать значение переменной нельзя
Aleksandr
почему? Там в обеих ветках идет перезапись
Aleksandr
если то, иначе се
Aleksandr
а так мы сразу се, ну а если то - тады ой)))
Maria
лучше исключать ветку else тоже - n = falseVal if expr { n = trueVal }
а почему лучше? (я такие конструкции в примерах вижу, но мне казалось, лучше четко и явно - if одно, то другое, else совсем другое)
chmod ugo-rwx
плодить ветвление - плохая манера, которая уменьшает производительность кода
Maria
вон чего... ладно тогда...
Aleksandr
ну скорее это стремление к минимализму синтаксиса - в пропозалах обсуждалось вообше исключение else. ну а еще тут на строчку меньше
Aleksandr
это не для всех работает - чаще для таких вот простых случаев
chmod ugo-rwx
Решил погуглить, как решить твою проблему с помощью ТО, а потом для себя открыл, что их в go нет, печаль
Тернарные операторы тоже не есть хорошо, но все равно обидно, что они отсутствуют
Null
🐄 cowsay - это забавная и очень полезная (нет) библиотека, которая умеет выводить картинки различных животных, нарисованные символами 👌🏼 Чтобы увидеть этот шедевр самостоятельно, запускай код, который приведен ниже. Github @Golang_google
Maria
лучше исключать ветку else тоже - n = falseVal if expr { n = trueVal }
Я зануда. Я не смогла (себе) доказать, что конструкция if-else медленнее, чем вынос else-опции вперёд if. 1) Первый вариант (с классической конструкцией if-else) выполняется 1953954000 нс ~= 2 c 2) Второй вариант (с заменой else на присвоение перед if, в условии if - верный вариант) выполняется 3907236500 нс ~= 4 c 3) Третий вариант (с заменой else на присвоение перед if, в условии if - ложный вариант) выполняется 3945387700 нс ~= 4 c Но есть нюанс: наверное, я не корректно измеряю время (хотя вроде теми методами, даже двумя: Since() и Sub(), которыми положено) Сначала у меня все три способа были в одном файле, и иногда получался такой же результат, как написала, а иногда на всё уходило одинаковое время, 2с. Потом разделила на разные проекты, и по нескольку раз позапускала, результат выше. Как вообще корректно, кстати, время измерять? Первый (уходит 2 с): package main import ( "fmt" "time" ) func main() { var i int64 var N int64 = 1e9 a := 1 b := 2 var k int // 1 - zasekaem vremya na variant s else: k = 0 start1 := time.Now() for i = 0; i < N; i++ { if a < b { k += 1 } else { k -= 1 } } duration1 := time.Since(start1) end1 := time.Now() elapsed1 := end1.Sub(start1) fmt.Println(duration1.Nanoseconds(), elapsed1.Nanoseconds(), k) } Второй (уходит 4 с): package main import ( "fmt" "time" ) func main() { var i int64 var N int64 = 1e9 a := 1 b := 2 var k int // 2 - teper - bez else - vynosim lozhnyj variant vpered, a v if proveriaem tolko pravilnyj variant: k = 0 start2 := time.Now() for i = 0; i < N; i++ { k -= 1 if a < b { k += 1 } } duration2 := time.Since(start2) end2 := time.Now() elapsed2 := end2.Sub(start2) fmt.Println(duration2.Nanoseconds(), elapsed2.Nanoseconds(), k) } Третий (уходит 4 с): package main import ( "fmt" "time" ) func main() { var i int64 var N int64 = 1e9 a := 1 b := 2 var k int // 3 - teper - bez else - vynosim true variant vpered, a v if proveriaem tolko nepravilnyj variant: k = 0 start3 := time.Now() for i = 0; i < N; i++ { k += 1 if a > b { k -= 1 } } duration3 := time.Since(start3) end3 := time.Now() elapsed3 := end3.Sub(start3) fmt.Println(duration3.Nanoseconds(), elapsed3.Nanoseconds(), k) }
Илья
для такого есть бенчмарки
Maria
https://pkg.go.dev/time#hdr-Monotonic_Clocks а вот эти рассуждения про monotonic clocks в time - выходит, не актуальны, мягко говоря?...
ортем
но здесь же логика в первом цикле и во 2/3 другая, нет?
ортем
в первом случае в каждой итерации происходит только одна операция -=/+=, а в остальных случаях либо одна, либо две
Maria
вот, какой-то бенчмарк использует тип time.Duration https://pkg.go.dev/google.golang.org/grpc@v1.48.0/benchmark/stats#Stats.AddDuration, а тип time.Duration используется в .Sub() (который я использовала) https://pkg.go.dev/time#Duration
Maria
в первом случае в каждой итерации происходит только одна операция -=/+=, а в остальных случаях либо одна, либо две
ну получается да, к этому и приводит вынос else-опции вперёд if-а То есть выносить else-опцию вперёд if (как было сказано кем-то из ребят, чтобы ветвлений было меньше) - получается, нет смысла
ортем
это бы не ломало логику, если бы там был ретурн
Maria
но здесь же логика в первом цикле и во 2/3 другая, нет?
смысл в том, чтобы проверить, выгодно ли отказываться от else. Вроде выходит, что нет.
Maria
а как надо написать, чтобы доказать, что if-else - плохо?
ортем
в данном случае это в принципе меняет логику, поэтому и смысла в этом нет
Илья
Я зануда. Я не смогла (себе) доказать, что конструкция if-else медленнее, чем вынос else-опции вперёд if. 1) Первый вариант (с классической конструкцией if-else) выполняется 1953954000 нс ~= 2 c 2) Второй вариант (с заменой else на присвоение перед if, в условии if - верный вариант) выполняется 3907236500 нс ~= 4 c 3) Третий вариант (с заменой else на присвоение перед if, в условии if - ложный вариант) выполняется 3945387700 нс ~= 4 c Но есть нюанс: наверное, я не корректно измеряю время (хотя вроде теми методами, даже двумя: Since() и Sub(), которыми положено) Сначала у меня все три способа были в одном файле, и иногда получался такой же результат, как написала, а иногда на всё уходило одинаковое время, 2с. Потом разделила на разные проекты, и по нескольку раз позапускала, результат выше. Как вообще корректно, кстати, время измерять? Первый (уходит 2 с): package main import ( "fmt" "time" ) func main() { var i int64 var N int64 = 1e9 a := 1 b := 2 var k int // 1 - zasekaem vremya na variant s else: k = 0 start1 := time.Now() for i = 0; i < N; i++ { if a < b { k += 1 } else { k -= 1 } } duration1 := time.Since(start1) end1 := time.Now() elapsed1 := end1.Sub(start1) fmt.Println(duration1.Nanoseconds(), elapsed1.Nanoseconds(), k) } Второй (уходит 4 с): package main import ( "fmt" "time" ) func main() { var i int64 var N int64 = 1e9 a := 1 b := 2 var k int // 2 - teper - bez else - vynosim lozhnyj variant vpered, a v if proveriaem tolko pravilnyj variant: k = 0 start2 := time.Now() for i = 0; i < N; i++ { k -= 1 if a < b { k += 1 } } duration2 := time.Since(start2) end2 := time.Now() elapsed2 := end2.Sub(start2) fmt.Println(duration2.Nanoseconds(), elapsed2.Nanoseconds(), k) } Третий (уходит 4 с): package main import ( "fmt" "time" ) func main() { var i int64 var N int64 = 1e9 a := 1 b := 2 var k int // 3 - teper - bez else - vynosim true variant vpered, a v if proveriaem tolko nepravilnyj variant: k = 0 start3 := time.Now() for i = 0; i < N; i++ { k += 1 if a > b { k -= 1 } } duration3 := time.Since(start3) end3 := time.Now() elapsed3 := end3.Sub(start3) fmt.Println(duration3.Nanoseconds(), elapsed3.Nanoseconds(), k) }
замеры через time.Since() неточные
Maria
а ещё интересно - похоже, go автоматически "расширяет" тип, если ему не хватает места: int до int64
Илья
инт это и есть int64 на 32 разрядных int32