- 1
- 2
- 3
- 4
- 5
- 6
- 7
func Map[F, T any](s []F, f func(F) T) []T {
r := make([]T, len(s))
for i, v := range s {
r[i] = f(v)
}
return r
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+2
func Map[F, T any](s []F, f func(F) T) []T {
r := make([]T, len(s))
for i, v := range s {
r[i] = f(v)
}
return r
}
Го сдался.
Технология новая, на практике толком никто не использовал. Поэтому если увидите какую-то неточность в статье, не стесняйтесь указать это в комментариях.
Самостоятельно поиграться с дженериками можно здесь
Итак, поехали.
https://habr.com/ru/company/karuna/blog/552944/
В go действительно порой очень не хватает дженериков, но решается это легко решается при помощи копипасты.
[/quote]
https://habr.com/ru/company/karuna/blog/552944/#comment_23107214
Вообще говоря при помощи копипасты очень многие задачи решаются в прогрммировании. Недооценённый инструмент
Видимо уже решилось
> Технология новая, на практике толком никто не использовал.
Не мудрено, ведь в «РНР» нет никаких дженериков :-)
> Несколько лет назад у нас в Каруне (Камеруне?!) возникла необходимость перевести несколько сервисов с PHP на GO. Как сейчас помню, в первой же программе потребовалось проверить, существует ли строка в некотором слайсе строк. Беглый гуглёж показал, что встроенной функции, аналогичной пхпшной in_array() в языке нет. Поэтому пришлось написать свою...
Мне аж самому стыдно такое читать.
го такой го
А я ещё думала, что в крестах стрёмная стандартная либа...
Типа вот у нас «слайс» (массив) строк, и нам нужно проверить, есть ли там заданная строка?
Итераторы и алгоритмы это круто:)
Кстати, это ещё и объясняет, зачем Гугл так гоняет всех соискателей по алгоритмам.
а в современных безопасных языках типа "Go" наконец программистам дали возможность писать поиск в массиве руками
> Гугл так гоняет всех соискателей по алгоритмам.
точно) они небось и кусорт пишут
А потом инлайнят вручную, т.к. функции после введения дженериков как-то шибко медленно работают.
Явное лучше неявного.
Видимо, гуглу наконец удалось своих программистов чему-то научить.
Зачем брать на работу чувака, который фреш аут оф скул, и ничего кроме джавы в жизни не видел?
Потому что последнее время продукты гугла - говно на палочке, особенно все эти гайды пол материал дизайн. Какого вдруг хуя все аватарки стали круглыми? И если нет юзерпика, то есть какие-то ебаные буквы
Говорят, что фотки в круглых рамочках лучше смотрятся, чем в квадратных. В общем-то у меня нет какого-то отвращения к кругам. Да и сам материал дизайн неплохо смотрится, лаконично.
И это что, на ГК устаревший дизайн что ли?
А ещё на ютубе испортился алгоритм по которому он ролики советует. Раньше как-то больше разнообразия было, а сейчас по кругу одно и тоже крутит.
а еще потому что у меня традиционный багор с них, который начался еще лет 10 назад, когда я обнаружил что в погодные ведропроги не кладут привычные юниты и без отдельного конвертера единиц хуй сравнишь какой прогнос врёт, а какой нет
Вот кстати, пример ебанутого решения. Почему-бы просто не отключить комменты для детских учёток. Ну и анонимусов, возможно. Почему остальные должны страдать из-за того, что кто-то посчитал, что видос пригоден для детей?
З.Ы. Не то чтобы мне хотелось читать комменты на ютубе, конечно.
- я понял, куда пропал Пи. Постоянно попадает на ютубе на ролики с отключёнными комментариями и не хватает fuel'а, чтобы креативить на ГК
Ну ладно, когда тамжедети!!!, там адекватности вообще ждать не приходится, но вот, вроде бы, нормальная хотелка - проиграть ровно одно видео из плейлиста (Watch Later, например) и остановиться, чтобы после конца песни не начинала орать следующая, ну или читаешь коменты, пока титры идут, а он тебе всё харе, вот тебе следующиее видео.
На десктопе просто - идешь в адресную строку, удаляешь list=WL и перезапускаешь, а на мобиле... ну тоже просто:
- Перетаскиваешь видео в конец плейлиста
- Ждешь несколько секунд, чтобы плейлист сохранился
- Запускаешь...
Но есть и положительные стороны - если вдруг захочется упороться наберите youtube kids be like amogus. Кратковременное расслоение мозжечка гарантировано. Говорят, от настоящего for kids не сильно отличается. Впрочем, Сыендук делал обзор и объяснял, почему так.
как можно будет теперь им пользоваться на мобиле или на каком-нибудь смарттв, я себе слабо представляю
началось всё еще в 2018 (емнип) с youtube premium, они даже высрали несколько крайне убогих сериалов в жанре сайфай
имею ввиду полноценных сериалов, не веб-огрызки которые делает например Machinima
ublock origin нормально с рекламой справляется
- в мобильном приложении?)
все равно реклама больше ресурсов сожрёт
И у любви у нашей села батарейка.
Из неправильной раскладки, походу. На английской лучше читается.
лучше всяких вакомов
«Go» в консистентности равняется на питухон.
З.Ы. Ну хотя... в coq есть тип False. У него нет ни одного конструктора. Именно этим он и полезен.
Можно сделать тип 'petuh'. Переменная этого типа может иметь значение 'petuh', а больше никакое не может.
Создается строковым литералом
а False не создать никак?
Нет, в том и фишка. Если ты каким-то образом смог написать функцию, которая его возвращает -- то или функция хуйня или аргументы противоречат друг другу
Да-да, оно самое и есть. Только в коке завершение функций гарантированно, поэтому кейс с "заебашу вечный цикл и верну never" там не катит.
То есть доказать бесконечность цикла там нельзя?
Неа. Там довольно тупая проверка, которая реджектит кучу валидных программ вместе с реально зависающими...
Один аргумент всегда должен уменьшаться в рекурсивном вызове.
Если ты сёмантику какого-то другого языка описываешь на коке -- там можно доказать. Ну опять же, вручную, для конкретных кейсов.
В общем виде -- ну х.з. премию получишь, наверное, если уговоришь coq этот цикл сконпелять. Это ведь равносильно пруфу данной гипотезы.
>а не как в жс.
шутка_про_тип_null_и_object
Тип поля петуха в коде ниже -- "petuh".
Тут ты можешь спросить: "а почему нельзя проверить instanceof Petuh, и не привязываться к полю в рантайме?"
А потому, что инстансы петуха могут прийти просто как объекты ({type:petuh})
Где тут такое место видишь?
Там еще ниже по коду такая функция есть
- чем это плохо?
Есть какой-то реальный пример без петухов и куриц?
Соответственно строковый тип не надо импортить явно там где хочешь передать его, но и в жс коде от него толку мало
А вообще они взаимозаменяемы, если функция принимает енам из чисел то и просто число примет если можно вывести что это число принимает только значения членов енама
Какая разница, кто соберёт это в enum, программист или компилятор?
И какая разница, строки это или идентификаторы / кейворды, если за этим следит транспилер и подсветка синтаксиса? Такая вот типизация миллениалов, а хули ты хотел?
Вот тебе по вебсокету пришли объекты, у которых в поле "type" строкой указан тип.
Это или "user" или "group".
TS позволяет это статически проверить
нет не позволяет
ты описал тип
А потом бекенд добавил в респонсы type: 'petuh' и ты обосрался
едитсвенный способ "статически" что-то проверить это попросить бек описать модели и сгенерить из них типы их автоматически, но потом ты опять же обосрешься при смене формата респонса бека без твоего участия
данные нужно валидировать и тайп скрип тебе в этом не поможет
бек, разумеется, может этот контракт нарушить, но тут тебе ничего уже не поможет: компилятор за бек не в ответе
func Map(s []{{ .F }}, f func({{ .F }}) {{ .T }}) []{{ .T }} {
r := make([]{{ .T }}, len(s))
for i, v := range s {
r[i] = f(v)
}
return r
}
```
Кодогенерация - наше всё...
Вообще
было бы понятнее
Надо было вообще сразу генерики делать, и не выеживаться.
Джава на эти грабли наступила, c# чуть-чуть испачкался, кем надо быть, чтобы в 2009-м году запускать ЯП без генериков?
Они пишут, что парсер в го тупой и они не хотят его усложнять. Именно поэтому в дженериках заюзали [ ] а не < >, которые будут конфликтовать со сравнениями.
Это насколько ж он тупой. Неужели по контексту нельзя отличить сравнение от даймонда
но питухи то с ноля писали
Ибо в некоторых случаях нужно вычислять выражения в компайлтайме чтобы отличить a<b> c от a < b > c.
Представь какой там ад в поддержке и тестировании. А в гошке контекстно-свободная скорее всего, как в паскале. Так что я понимаю их выбор.
Для контекстно свободной вроде автомат с магазином используется
>Представь какой там ад в поддержке и тестировании
то-то я смотрю, что решарпер шаблоны не особо-то и раскрывает, и код весь зеленый, а компиляция падает с пиздецовой ошибкой
Он и парсить вечно может, походу... Но на практике обычно просто память кончается или лимиты на вложенность, GC ещё не завезли.
А как можно было бы сделать красиво обобщённое программирование без шаблонов и без потери перформанса?
А хер знает, тут всегда джва стула же: либо ты делаешь юзаешь один инстанс для всех и теряешь пирфоманс и гибкость, либо делаешь разные инстансы под разные типы и теряешь место и простоту.
> проблем
Да не то чтобы это было проблемой... Любая достаточно продвинутая метушня может виснуть. Иначе она неполноценна и имеет кучу ограничений (см. сишные макросы).
А в вашем <ЯП> можно подвесить компилятор?
Впрочем, можно подключить какие-то патчеры AST к компилятору
> патчеры AST
Какая гомоиконность )))
>Какая го
не совсем: они же не в моем коде, а отдельным агентом
А как работает ломбок? а NotNull как?
Вот в груви можно налету патчить, но груви увы
ps: Или я напиздел, и там патчат байткод?
Через annotation processors и модификацию байткода, хотя сами процессоры для этого ня преднязначены, а весь Ломбок — грязный хак.
https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Processor.html
https://www.raywenderlich.com/8574679-annotation-processing-supercharge-your-development (Котлин)
А в майкрософте с их крестами приходится специально обученный компилятор использовать, чтобы он в начале функций несколько nop'ов вставлял, чтобы туда можно было jmp прописать в случае чего.
можешь в Number насрать
Вообщем чёрт его знает. Если perl красив тем, что можно написать одно и тоже триллионом разных способов (и как раз эта замечательная особенность многим не нравится, а особенно она не нравится бизнесу и энтерпрайзу). Go — прекрасен тем, что он дубовый и кондовый. Просто берёшь, просто делаешь и моментально получаешь результаты высокого качества
[/quote]
Блядь, я словно бы снова в 1999-м году.
Джава точно так же кичилась тем, что "кондовая" и птион тоже.
И в итоге кондовость была признана недостатком.
- простыня мокрая?
Ага.
Вот тебе код на 3.10
проще некуда
return nil, err
}
process($a.next())
}
Главное не перепутать...
Нужно быть немножко внимательнее просто
https://pbs.twimg.com/media/DCIF7-2W0AEAv9c.jpg
Не думайте, что я шучу
https://twitter.com/NateTheFinch/status/899730215957561344
кстати, питухи, делаете свои кастомные сниппеты в своей любимой иде?
Не люблю сниппеты. Если нужно постоянно набирать одно и то же, то ты делаешь что-то не то, а для питушни типа ключевых слов и конструкций языка полезнее скорость слепой печати прокачать, чтобы стать боссом опен-спейса со своими Cherry MX Blue.
ヽ( ̄ω ̄(。。 )ゝ
https://stackoverflow.com/questions/42691402/is-there-a-way-to-automatically-create-dependencyproperty-in-mvvm/42691472
``propdp`` раскрывался в
Это одно проперти (тн зависимое)
Это вам не гошная проверка ошибок