- 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
}
Го сдался.
PolinaAksenova 02.06.2021 14:40 # +2
Технология новая, на практике толком никто не использовал. Поэтому если увидите какую-то неточность в статье, не стесняйтесь указать это в комментариях.
Самостоятельно поиграться с дженериками можно здесь
Итак, поехали.
https://habr.com/ru/company/karuna/blog/552944/
MAKAKA 02.06.2021 22:49 # +4
В go действительно порой очень не хватает дженериков, но решается это легко решается при помощи копипасты.
[/quote]
https://habr.com/ru/company/karuna/blog/552944/#comment_23107214
Вообще говоря при помощи копипасты очень многие задачи решаются в прогрммировании. Недооценённый инструмент
vistefan 03.06.2021 01:16 # +1
Видимо уже решилось
JloJle4Ka 02.06.2021 14:47 # +1
> Технология новая, на практике толком никто не использовал.
Не мудрено, ведь в «РНР» нет никаких дженериков :-)
> Несколько лет назад у нас в Каруне (Камеруне?!) возникла необходимость перевести несколько сервисов с PHP на GO. Как сейчас помню, в первой же программе потребовалось проверить, существует ли строка в некотором слайсе строк. Беглый гуглёж показал, что встроенной функции, аналогичной пхпшной in_array() в языке нет. Поэтому пришлось написать свою...
Мне аж самому стыдно такое читать.
MAKAKA 02.06.2021 14:59 # +3
го такой го
bormand 02.06.2021 16:52 # 0
А я ещё думала, что в крестах стрёмная стандартная либа...
JloJle4Ka 02.06.2021 17:01 # 0
Типа вот у нас «слайс» (массив) строк, и нам нужно проверить, есть ли там заданная строка?
bormand 02.06.2021 17:01 # +1
JloJle4Ka 02.06.2021 17:05 # +1
MAKAKA 02.06.2021 17:06 # +2
Итераторы и алгоритмы это круто:)
JloJle4Ka 02.06.2021 17:10 # +2
Кстати, это ещё и объясняет, зачем Гугл так гоняет всех соискателей по алгоритмам.
MAKAKA 02.06.2021 17:14 # +2
а в современных безопасных языках типа "Go" наконец программистам дали возможность писать поиск в массиве руками
> Гугл так гоняет всех соискателей по алгоритмам.
точно) они небось и кусорт пишут
JloJle4Ka 02.06.2021 17:22 # +1
А потом инлайнят вручную, т.к. функции после введения дженериков как-то шибко медленно работают.
MAKAKA 02.06.2021 17:48 # +3
vistefan 03.06.2021 00:56 # 0
bormand 02.06.2021 14:50 # +3
Явное лучше неявного.
bormand 02.06.2021 15:02 # +2
MAKAKA 02.06.2021 15:10 # +2
bormand 02.06.2021 14:52 # +3
CHayT 02.06.2021 15:10 # +2
Видимо, гуглу наконец удалось своих программистов чему-то научить.
bormand 02.06.2021 15:11 # +3
MAKAKA 02.06.2021 15:13 # +2
Зачем брать на работу чувака, который фреш аут оф скул, и ничего кроме джавы в жизни не видел?
bormand 02.06.2021 15:14 # +1
CHayT 02.06.2021 15:21 # +3
MAKAKA 02.06.2021 15:35 # +3
vistefan 03.06.2021 00:35 # 0
MAKAKA 03.06.2021 02:28 # +2
vistefan 03.06.2021 00:32 # +2
Потому что последнее время продукты гугла - говно на палочке, особенно все эти гайды пол материал дизайн. Какого вдруг хуя все аватарки стали круглыми? И если нет юзерпика, то есть какие-то ебаные буквы
bormand 03.06.2021 01:02 # 0
Говорят, что фотки в круглых рамочках лучше смотрятся, чем в квадратных. В общем-то у меня нет какого-то отвращения к кругам. Да и сам материал дизайн неплохо смотрится, лаконично.
Desktop 03.06.2021 01:11 # 0
И это что, на ГК устаревший дизайн что ли?
vistefan 03.06.2021 01:31 # 0
bormand 03.06.2021 02:05 # 0
А ещё на ютубе испортился алгоритм по которому он ролики советует. Раньше как-то больше разнообразия было, а сейчас по кругу одно и тоже крутит.
JloJle4Ka 03.06.2021 04:18 # +2
gologub 03.06.2021 08:43 # +3
TOPT 03.06.2021 10:05 # +3
gologub 03.06.2021 15:16 # 0
а еще потому что у меня традиционный багор с них, который начался еще лет 10 назад, когда я обнаружил что в погодные ведропроги не кладут привычные юниты и без отдельного конвертера единиц хуй сравнишь какой прогнос врёт, а какой нет
bormand 03.06.2021 10:51 # +1
Вот кстати, пример ебанутого решения. Почему-бы просто не отключить комменты для детских учёток. Ну и анонимусов, возможно. Почему остальные должны страдать из-за того, что кто-то посчитал, что видос пригоден для детей?
З.Ы. Не то чтобы мне хотелось читать комменты на ютубе, конечно.
Desktop 03.06.2021 12:36 # 0
Desktop 03.06.2021 12:37 # 0
- я понял, куда пропал Пи. Постоянно попадает на ютубе на ролики с отключёнными комментариями и не хватает fuel'а, чтобы креативить на ГК
Steve_Brown 03.06.2021 13:07 # 0
Ну ладно, когда тамжедети!!!, там адекватности вообще ждать не приходится, но вот, вроде бы, нормальная хотелка - проиграть ровно одно видео из плейлиста (Watch Later, например) и остановиться, чтобы после конца песни не начинала орать следующая, ну или читаешь коменты, пока титры идут, а он тебе всё харе, вот тебе следующиее видео.
На десктопе просто - идешь в адресную строку, удаляешь list=WL и перезапускаешь, а на мобиле... ну тоже просто:
- Перетаскиваешь видео в конец плейлиста
- Ждешь несколько секунд, чтобы плейлист сохранился
- Запускаешь...
Но есть и положительные стороны - если вдруг захочется упороться наберите youtube kids be like amogus. Кратковременное расслоение мозжечка гарантировано. Говорят, от настоящего for kids не сильно отличается. Впрочем, Сыендук делал обзор и объяснял, почему так.
Desktop 03.06.2021 13:24 # 0
как можно будет теперь им пользоваться на мобиле или на каком-нибудь смарттв, я себе слабо представляю
Soul_re@ver 03.06.2021 13:48 # 0
CHayT 03.06.2021 14:16 # +1
bormand 03.06.2021 14:29 # 0
gologub 03.06.2021 16:16 # 0
началось всё еще в 2018 (емнип) с youtube premium, они даже высрали несколько крайне убогих сериалов в жанре сайфай
имею ввиду полноценных сериалов, не веб-огрызки которые делает например Machinima
ublock origin нормально с рекламой справляется
Desktop 03.06.2021 16:22 # 0
- в мобильном приложении?)
gologub 03.06.2021 16:28 # 0
все равно реклама больше ресурсов сожрёт
Desktop 03.06.2021 16:30 # 0
MAKAKA 03.06.2021 16:37 # +1
gologub 03.06.2021 16:37 # 0
Desktop 03.06.2021 16:39 # 0
bormand 03.06.2021 17:06 # +1
И у любви у нашей села батарейка.
gologub 04.06.2021 03:35 # 0
CHayT 03.06.2021 17:09 # 0
Desktop 03.06.2021 17:14 # 0
MAKAKA 03.06.2021 13:27 # 0
Steve_Brown 03.06.2021 18:36 # 0
guest6 03.06.2021 18:39 # 0
JloJle4Ka 03.06.2021 18:40 # 0
bormand 03.06.2021 18:43 # +2
Из неправильной раскладки, походу. На английской лучше читается.
gologub 03.06.2021 15:49 # +3
JloJle4Ka 03.06.2021 18:27 # +1
gologub 04.06.2021 03:30 # +1
лучше всяких вакомов
JloJle4Ka 02.06.2021 15:26 # 0
«Go» в консистентности равняется на питухон.
bormand 02.06.2021 15:53 # +1
JloJle4Ka 02.06.2021 17:02 # +1
bormand 02.06.2021 17:03 # +1
З.Ы. Ну хотя... в coq есть тип False. У него нет ни одного конструктора. Именно этим он и полезен.
MAKAKA 02.06.2021 17:05 # +1
Можно сделать тип 'petuh'. Переменная этого типа может иметь значение 'petuh', а больше никакое не может.
Создается строковым литералом
bormand 02.06.2021 17:07 # 0
MAKAKA 02.06.2021 17:08 # 0
а False не создать никак?
bormand 02.06.2021 17:10 # 0
Нет, в том и фишка. Если ты каким-то образом смог написать функцию, которая его возвращает -- то или функция хуйня или аргументы противоречат друг другу
MAKAKA 02.06.2021 17:12 # 0
bormand 02.06.2021 17:13 # +3
Да-да, оно самое и есть. Только в коке завершение функций гарантированно, поэтому кейс с "заебашу вечный цикл и верну never" там не катит.
Soul_re@ver 02.06.2021 20:53 # +1
То есть доказать бесконечность цикла там нельзя?
bormand 02.06.2021 21:04 # +1
Неа. Там довольно тупая проверка, которая реджектит кучу валидных программ вместе с реально зависающими...
Один аргумент всегда должен уменьшаться в рекурсивном вызове.
Если ты сёмантику какого-то другого языка описываешь на коке -- там можно доказать. Ну опять же, вручную, для конкретных кейсов.
Soul_re@ver 02.06.2021 21:10 # +1
bormand 02.06.2021 21:14 # +2
В общем виде -- ну х.з. премию получишь, наверное, если уговоришь coq этот цикл сконпелять. Это ведь равносильно пруфу данной гипотезы.
JloJle4Ka 02.06.2021 17:14 # 0
bormand 02.06.2021 17:15 # +2
MAKAKA 02.06.2021 17:17 # +2
>а не как в жс.
шутка_про_тип_null_и_object
Desktop 02.06.2021 23:09 # 0
bormand 02.06.2021 23:20 # 0
MAKAKA 02.06.2021 23:23 # +1
Тип поля петуха в коде ниже -- "petuh".
Тут ты можешь спросить: "а почему нельзя проверить instanceof Petuh, и не привязываться к полю в рантайме?"
А потому, что инстансы петуха могут прийти просто как объекты ({type:petuh})
Desktop 03.06.2021 00:02 # 0
MAKAKA 03.06.2021 00:04 # 0
Где тут такое место видишь?
Там еще ниже по коду такая функция есть
Desktop 03.06.2021 00:09 # 0
- чем это плохо?
Есть какой-то реальный пример без петухов и куриц?
bootcamp_dropout 03.06.2021 01:23 # +1
Соответственно строковый тип не надо импортить явно там где хочешь передать его, но и в жс коде от него толку мало
А вообще они взаимозаменяемы, если функция принимает енам из чисел то и просто число примет если можно вывести что это число принимает только значения членов енама
Desktop 03.06.2021 01:30 # 0
bootcamp_dropout 03.06.2021 09:31 # 0
vistefan 03.06.2021 01:29 # +1
Какая разница, кто соберёт это в enum, программист или компилятор?
И какая разница, строки это или идентификаторы / кейворды, если за этим следит транспилер и подсветка синтаксиса? Такая вот типизация миллениалов, а хули ты хотел?
MAKAKA 03.06.2021 02:29 # 0
Вот тебе по вебсокету пришли объекты, у которых в поле "type" строкой указан тип.
Это или "user" или "group".
TS позволяет это статически проверить
bootcamp_dropout 05.06.2021 15:07 # +1
нет не позволяет
ты описал тип
А потом бекенд добавил в респонсы type: 'petuh' и ты обосрался
едитсвенный способ "статически" что-то проверить это попросить бек описать модели и сгенерить из них типы их автоматически, но потом ты опять же обосрешься при смене формата респонса бека без твоего участия
данные нужно валидировать и тайп скрип тебе в этом не поможет
booratihno 05.06.2021 15:14 # 0
бек, разумеется, может этот контракт нарушить, но тут тебе ничего уже не поможет: компилятор за бек не в ответе
JaneBurt 02.06.2021 21:33 # 0
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
}
```
Кодогенерация - наше всё...
MAKAKA 02.06.2021 22:23 # 0
bormand 02.06.2021 22:33 # 0
MAKAKA 02.06.2021 22:37 # 0
Вообще
было бы понятнее
bormand 02.06.2021 22:41 # 0
MAKAKA 02.06.2021 22:44 # 0
Надо было вообще сразу генерики делать, и не выеживаться.
Джава на эти грабли наступила, c# чуть-чуть испачкался, кем надо быть, чтобы в 2009-м году запускать ЯП без генериков?
bormand 02.06.2021 22:58 # +1
Они пишут, что парсер в го тупой и они не хотят его усложнять. Именно поэтому в дженериках заюзали [ ] а не < >, которые будут конфликтовать со сравнениями.
Desktop 02.06.2021 23:09 # 0
vistefan 03.06.2021 01:17 # +1
Это насколько ж он тупой. Неужели по контексту нельзя отличить сравнение от даймонда
Desktop 03.06.2021 01:23 # +1
Desktop 02.06.2021 23:08 # 0
bormand 02.06.2021 23:22 # 0
MAKAKA 02.06.2021 23:30 # 0
но питухи то с ноля писали
bormand 02.06.2021 23:38 # +1
Ибо в некоторых случаях нужно вычислять выражения в компайлтайме чтобы отличить a<b> c от a < b > c.
Представь какой там ад в поддержке и тестировании. А в гошке контекстно-свободная скорее всего, как в паскале. Так что я понимаю их выбор.
MAKAKA 02.06.2021 23:44 # +1
Для контекстно свободной вроде автомат с магазином используется
>Представь какой там ад в поддержке и тестировании
то-то я смотрю, что решарпер шаблоны не особо-то и раскрывает, и код весь зеленый, а компиляция падает с пиздецовой ошибкой
bormand 02.06.2021 23:45 # +1
Он и парсить вечно может, походу... Но на практике обычно просто память кончается или лимиты на вложенность, GC ещё не завезли.
MAKAKA 02.06.2021 23:53 # 0
А как можно было бы сделать красиво обобщённое программирование без шаблонов и без потери перформанса?
j123123 02.06.2021 23:55 # +1
MAKAKA 02.06.2021 23:57 # 0
bormand 02.06.2021 23:59 # 0
j123123 03.06.2021 00:38 # 0
CHayT 03.06.2021 19:09 # +1
bormand 02.06.2021 23:57 # +1
А хер знает, тут всегда джва стула же: либо ты делаешь юзаешь один инстанс для всех и теряешь пирфоманс и гибкость, либо делаешь разные инстансы под разные типы и теряешь место и простоту.
> проблем
Да не то чтобы это было проблемой... Любая достаточно продвинутая метушня может виснуть. Иначе она неполноценна и имеет кучу ограничений (см. сишные макросы).
Soul_re@ver 03.06.2021 00:03 # 0
А в вашем <ЯП> можно подвесить компилятор?
MAKAKA 03.06.2021 00:05 # +1
Впрочем, можно подключить какие-то патчеры AST к компилятору
vistefan 03.06.2021 01:26 # 0
bormand 03.06.2021 02:31 # 0
> патчеры AST
Какая гомоиконность )))
MAKAKA 03.06.2021 02:33 # +1
>Какая го
не совсем: они же не в моем коде, а отдельным агентом
А как работает ломбок? а NotNull как?
Вот в груви можно налету патчить, но груви увы
ps: Или я напиздел, и там патчат байткод?
PolinaAksenova 03.06.2021 04:14 # +1
Через 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 (Котлин)
MAKAKA 03.06.2021 04:19 # 0
JloJle4Ka 03.06.2021 04:55 # 0
bormand 03.06.2021 07:51 # +2
Soul_re@ver 03.06.2021 18:24 # +3
А в майкрософте с их крестами приходится специально обученный компилятор использовать, чтобы он в начале функций несколько nop'ов вставлял, чтобы туда можно было jmp прописать в случае чего.
MAKAKA 03.06.2021 18:29 # +2
можешь в Number насрать
bormand 03.06.2021 18:36 # 0
Steve_Brown 03.06.2021 13:14 # 0
vistefan 04.06.2021 08:32 # 0
vistefan 03.06.2021 01:19 # 0
MAKAKA 02.06.2021 23:06 # +1
Вообщем чёрт его знает. Если perl красив тем, что можно написать одно и тоже триллионом разных способов (и как раз эта замечательная особенность многим не нравится, а особенно она не нравится бизнесу и энтерпрайзу). Go — прекрасен тем, что он дубовый и кондовый. Просто берёшь, просто делаешь и моментально получаешь результаты высокого качества
[/quote]
Блядь, я словно бы снова в 1999-м году.
Джава точно так же кичилась тем, что "кондовая" и птион тоже.
И в итоге кондовость была признана недостатком.
Desktop 02.06.2021 23:08 # 0
- простыня мокрая?
vistefan 03.06.2021 01:18 # 0
MAKAKA 03.06.2021 02:31 # 0
Ага.
Вот тебе код на 3.10
проще некуда
rotoeb 03.06.2021 19:02 # 0
bormand 03.06.2021 19:03 # +1
JloJle4Ka 03.06.2021 19:04 # 0
MAKAKA 03.06.2021 19:06 # +3
bormand 03.06.2021 19:07 # +1
MAKAKA 03.06.2021 19:09 # 0
return nil, err
}
JloJle4Ka 03.06.2021 19:12 # 0
process($a.next())
}
bormand 03.06.2021 19:13 # +1
Главное не перепутать...
JloJle4Ka 03.06.2021 19:15 # 0
MAKAKA 03.06.2021 19:16 # +2
Нужно быть немножко внимательнее просто
bormand 03.06.2021 19:17 # +2
MAKAKA 03.06.2021 19:21 # +3
https://pbs.twimg.com/media/DCIF7-2W0AEAv9c.jpg
Не думайте, что я шучу
https://twitter.com/NateTheFinch/status/899730215957561344
Desktop 03.06.2021 19:36 # +1
кстати, питухи, делаете свои кастомные сниппеты в своей любимой иде?
CHayT 03.06.2021 20:26 # +2
Не люблю сниппеты. Если нужно постоянно набирать одно и то же, то ты делаешь что-то не то, а для питушни типа ключевых слов и конструкций языка полезнее скорость слепой печати прокачать, чтобы стать боссом опен-спейса со своими Cherry MX Blue.
Desktop 03.06.2021 20:53 # 0
CHayT 03.06.2021 21:00 # +2
ヽ( ̄ω ̄(。。 )ゝ
MAKAKA 03.06.2021 21:07 # +4
https://stackoverflow.com/questions/42691402/is-there-a-way-to-automatically-create-dependencyproperty-in-mvvm/42691472
``propdp`` раскрывался в
Это одно проперти (тн зависимое)
Это вам не гошная проверка ошибок
CHayT 03.06.2021 19:22 # +2
JloJle4Ka 03.06.2021 19:09 # 0
Coq 04.06.2021 11:47 # 0
PolinaAksenova 04.06.2021 12:11 # +2
JloJle4Ka 04.06.2021 13:06 # 0
Steve_Brown 04.06.2021 17:29 # 0
nuTepcKuu_nemyx 08.06.2021 16:25 # 0
guest6 04.06.2021 13:09 # 0
gologub 08.06.2021 16:33 # +1