Зачем Go нужны дженерики


Оглавление (нажмите, чтобы открыть):

Почему нет дженериков в Go?

109 lbruder [2010-10-12 09:10:00]

Отказ от ответственности: я играл только с Go в течение одного дня, так что у меня был хороший шанс, что я пропустил много.

Кто-нибудь знает, почему нет реальной поддержки для generics/templates/whatsInAName в Go? Таким образом, существует общий map , но предоставленный компилятором, в то время как программист Go не может написать свою собственную реализацию. Со всем разговором о том, как сделать Go максимально ортогональным, почему я могу использовать общий тип, но не CREATE новый?

Особенно, когда речь заходит о функциональном программировании, есть лямбды, даже замыкания, но с системой статического типа, не имеющей дженериков, как я пишу, ну, общие функции более высокого порядка, такие как filter(predicate, list) ? OK, Связанные списки и т.п. Могут быть сделаны с interface<> безопасностью типа жертвы.

Поскольку быстрый поиск по SO/Google не выявил каких-либо прозрений, похоже, что дженерики, если вообще будут, будут добавлены к Go в качестве запоздалой мысли. Я действительно доверяю Томпсону, чтобы сделать что-то лучше, чем Java-ребята, но зачем хранить генералы? Или они планируются и еще не реализованы?

generics functional-programming go

4 ответа

71 Решение Vinzenz [2010-10-12 09:11:00]

В какой-то момент вполне могут быть добавлены дженерики. Мы не чувствуем для них неотложности, хотя мы понимаем, что некоторые программисты это делают.

Дженерики удобны, но они сложны по сложности в системе типов и времени выполнения. Мы еще не нашли дизайн, который дает ценность, пропорциональную сложности, хотя мы продолжаем думать об этом. Между тем, Go встроенных карт и фрагментов, а также возможность использования пустого интерфейса для создания контейнеров (с явным распаковкой) во многих случаях означают, что во многих случаях можно написать код, который делает то, что генерические средства разрешат, если менее плавно.

Это остается открытой проблемой.

27 user7610 [2014-10-13 22:36:00]

Черновик дизайна для дженериков находится по адресу https://blog.golang.org/go2draft.

Расс Кокс, один из ветеранов Go, написал пост в блоге под названием «Общая дилемма», в котором он спрашивает

. вам нужны медленные программисты, медленные компиляторы и раздутые двоичные файлы или медленное время выполнения?

Медленные программисты, являющиеся результатом отсутствия дженериков, медленные компиляторы вызваны C++, такими как дженерики, и медленное время выполнения проистекает из подхода упаковки-распаковки, который использует Java.

Четвертая возможность, не упомянутая в блоге, идет по маршруту С#. Генерация специализированного кода, как в C++, но во время выполнения, когда это необходимо. Мне действительно это нравится, но Go очень не похож на С#, так что это, вероятно, вообще не применимо.

Я должен упомянуть, что использование популярной Java 1.4-подобной техники общего программирования в go, которая приводит к interface<> страдает точно такими же проблемами, как и распаковка (потому что это то, что мы делаем), кроме потери безопасности типов времени компиляции. Для небольших типов (например, int) Go оптимизирует тип interface<> так, чтобы список типов, приведенных к интерфейсу <>, занимал непрерывную область памяти и занимал только вдвое больше места, чем обычные типы. Однако при приведении из interface<> все еще существуют накладные расходы на проверки во время выполнения. Ссылка

Все проекты, в которые добавлена общая поддержка (их несколько, и все они интересны), одинаково идут по пути C++ генерации кода времени компиляции.

Несмотря на то, что в настоящее время не существует встроенных генераторов, существует несколько внешних реализаций дженериков для go, которые используют комментарии в комбинациях с небольшими утилитами, которые генерируют код.

0 pete [2020-01-23 10:27:00]

Параметрический полиморфизм (дженерики) находится на рассмотрении для Go 2.

Этот подход вводит концепцию контракта, которую можно использовать для выражения ограничений на параметры типа:

Такой договор может быть использован таким образом:

Это предложение на данном этапе.

Ваша функция filter(predicate, list) может быть реализована с параметром типа, подобным этому:


В этом случае нет необходимости ограничивать T

Какими будут дженерики в Go?

В последнее время очень много критики о Голанге, потому что у него нет поддержки дженериков. Что именно это значит? Как бы вы объяснили это кому-то из динамически типизированного языка, такого как Ruby, где это не знакомая концепция?

На динамически типизированном языке вам все равно, какой тип списка он есть, просто это список. Однако на статически типизированном языке вам все равно, какой тип списка он есть, потому что тип — это «список A», где «A» — это какой-то тип. То есть, list A отличается от list B .

Поэтому, когда вы говорите о дженериках, вызывая некоторую функцию типа A -> B , каждый элемент списка с foreach означает, что список должен быть list A . Но. если вы используете дженерики, то вам не нужно объявлять, что A , вы можете просто заполнить его позже. Таким образом, вы устанавливаете контракт, в соответствии с которым задается list C и функция A -> B , A === C для ее компиляции. Это значительно уменьшает количество плитки.

В Go, учитывая отсутствие дженериков и возможность объявить такой контракт типа, вы должны написать функцию, которая работает в списке int, списке ******, списке строк и т.д. t просто определите вещи «общим» образом.

Уильям Б. Ягер сообщение в блоге напоминает почему «родовой» части, присутствующей в Go, недостаточно:

Вы можете написать общие функции достаточно легко. Скажем, вы хотели написать функцию, которая печатала хеш-код для объектов, которые можно было бы хэшировать. Вы можете определить интерфейс, который позволит вам сделать это с помощью гарантий безопасности статического типа, например:

Теперь вы можете указать любой объект Hashable на printHash , а также получить статическую проверку типа. Это хорошо.

Что делать, если вы хотите написать общую структуру данных? Пусть напишите простой Связанный список. Идиоматический способ написать общую структуру данных в Go:

(вот только начало)

«Правильный» способ построения общих структур данных в Go — это отличать вещи от верхнего типа, а затем помещать их в структуру данных. Так работала Java, примерно в 2004 году. Тогда люди поняли, что это полностью победит цель систем типов .

Когда у вас есть структуры данных, подобные этому, вы полностью устраняете любые преимущества, предоставляемые системой типов. Например, это вполне допустимый код:

Вот почему, если вы хотите сохранить преимущество системы типов, вам нужно использовать некоторую генерацию кода , чтобы сгенерировать код boileplate для вашего конкретного типа.

gen project является примером такого подхода:

gen генерирует код для ваших типов во время разработки, используя командную строку. gen не является импортом; сгенерированный источник становится частью вашего проекта и не принимает внешних зависимостей.

Обновление июня 2020 года: Дэйв Чейни подробно рассказал о том, что Generics for Go будет означать в его статьях «Простота долга» и » Simplicity Debt Redux».

Так как Go 2.0 теперь активно обсуждается на уровне базовой команды, Дэйв указывает, что включает в себя Generics, и это:

  • Обработка ошибок : Generic позволит монадическую обработку ошибок, то есть вам нужно понять монаду поверх остальные: позволяют обрабатывать вычислительный конвейер вместо проверки ошибок после каждого вызова функции. Но: вам нужно понять монаду!
  • Коллекции : упрощение создания пользовательских типов коллекций без необходимости использования интерфейса <> бокса и утверждения типа. Но это оставляет вопрос о том, что делать со встроенными средами и типами карт.
  • Нарезка . Уходит ли это, если да, то как это повлияет на общие операции, такие как обработка результата вызовом io.Reader.Read ? Если нарезка не исчезнет, ​​потребуются ли дополнительные перегрузки оператора, чтобы пользовательские типы коллекций могли реализовать оператор среза?
  • Вектор : тип массива типа Gos Pascal имеет фиксированный размер, известный во время компиляции. Как вы могли бы реализовать растущий вектор, не прибегая к небезопасным хакам?
  • Iterator : то, что вы действительно хотите сделать, — это создавать итераторы по результатам базы данных и сетевым запросам. Короче говоря, данные из-за пределов вашего процесса — и когда данные находятся вне вашего процесса, извлечение его может потерпеть неудачу. В этом случае у вас есть выбор, возвращает ли ваш Iterable интерфейс значение, значение и ошибка, или, возможно, вы сходите по маршруту типа опции.
  • Неизменность . Возможность отмечать функциональный параметр как const недостаточна, поскольку, пока он ограничивает приемник от изменения значения, он не запрещает вызывающему абоненту делать это, то есть большинство гонок данных, которые я вижу сегодня в программах Go. Возможно, то, что требует Go, — это не неизменность, а семантика собственности.

Сегодня появляются новые попытки учиться, в том числе Дарт, Мидори, Руст и Свифт.

Tproger для программистов. Страница 3

Tproger — одно из крупнейших в рунете объединений программистов.

Tproger для программистов

ВЫ студент IT, математических или экономических специальностей? Ищете подработку или даже профильную стажировку с графиком от 20 до 40 часов в неделю?

Тогда проверьте свои знания на прочность, ответив на 8 вопросов, и получите приглашение на оплачиваемую стажировку по направлениям:
— аналитика;
— data science;
— data engineering.

Переходите по ссылке и проходите тест: https://vk.cc/9X6MRk


Это #партнёрский пост

Tproger для программистов

Причём с помощью нейросетей был создан не только текст книги, но и обложка, описание, рецензии и фото людей, «оставивших» эти рецензии.

Мастер Йода рекомендует:  История одной утечки Motherboard выяснил, как код iBoot попал на GitHub

Подробности читайте на сайте проекта: https://booksby.ai

#книги #ии #нейросети

Tproger для программистов

1 ноября Huawei и Honor приглашают разработчиков мобильных приложений на конференцию Huawei Developer Day по запуску новой открытой платформы Huawei Mobile Services.

Подробности и заявка на бесплатное участие по ссылке: https://tiny.cc/5b50ez

Это #партнёрский пост

Реклама

Tproger для программистов

https://www.emuvr.net Patreon: https://www.patreon.com/EmuVR Twitter: https://www.twitter.com/EmuVR Facebook: https://www.facebook.com/EmuVR

Tproger для программистов

Что в курсе?
— настройка окружения и создание Go-файлов;
— типы данных и переменные;
— условные операторы;
— функции.

Tproger для программистов

Он может порекомендовать вам какой-нибудь хакерский фильм. А если у вас есть свой любимый фильм, то можете порекомендовать его боту. Он посмотрит и добавит в подборку, если понравится.

Ещё бот предложит вам пройти какой-нибудь айтишный тест, сгенерирует отговорку для вашего начальника/жены/коллеги/друга/кота и расскажет о других наших каналах в телеге.

Tproger для программистов

Что в мире происходит

�� Вышел Chrome 78. Разработчики реализовали совместный буфер обмена на связанных устройствах, перевод звонка с десктопного браузера на Android и экспериментальную поддержку DNS-поверх-HTTPS: https://tprg.ru/cWSk

�� Netflix открыла код инструмента Polynote для исследователей. У него блочная структура, в каждом блоке может быть либо текст с математическими формулами, либо код на одном из поддерживаемых языков: https://tprg.ru/pFjX

��‍�� Состоялся релиз Node.js 13.0 — платформы для выполнения сетевых приложений на JavaScript. В новой версии обновили движок V8, добавили и включили по умолчанию полную поддержку Unicode, а также улучшили поддержку Python 3: https://tprg.ru/PiCq

�� В даркнете снова нашли объявление о продаже данных кредитных клиентов «Сбербанка». МВД говорит, что полиция задержала предполагаемого продавца, сотрудника коллекторской фирмы, подрядчика «Сбербанка»: https://tprg.ru/leNd

�� Команда TON предложила инвесторам подождать запуска платформы 5 месяцев. Если они не согласятся, разработчикам придётся вернуть деньги. По словам The Bell, большинство инвесторов решило подождать. Запуск должен состояться 30 апреля: https://tprg.ru/ZfGu

�� Французский разработчик создал резюме в виде 3D-игры. Это небольшая площадка, по которой передвигаться надо на миниатюрном джипе. Пользователь может поехать в трёх направлениях: портфолио с описанием предыдущих проектов, информация о потенциальном сотруднике с контактами и игровая зона: https://tprg.ru/ok2N

Большие обзоры новостей, с шуточками и авторской подачей, ловите по будням в канале @tprogerdaily


Tproger для программистов

Промокоды и никакого тестового задания: как стартапам конкурировать с корпорациями в битве за разработчиков

Каким образом стартапы борются за лучших разработчиков? Как правильно подойти к собеседованию? Чем привлечь в рабочих процессах? «Дух стартапа» — хорошо или плохо?

Спросили об этом у HR-менеджера стартапа Instamart.

А вы что охотней выберете? Стартап или крупную корпорацию?

Tproger для программистов

Если не знаете, чем себя занять на выходных, то предлагаем заценить документалку про зарождение рунета. От появления пАдонков, зарождения Яндекса и троллей в ЖЖ до Дурова, YouTube и комиков.

Посмотрите, как всего 20 лет назад самым популярным ресурсом в рунете был анекдот.ру, как взлетал и падал Рамблер и почему теперь YouTube — главная площадка потребления контента.

Документалка состоит из 7 серий: https://tprg.ru/D6FZ

А если не хотите видео, то здесь их текстовые расшифровки: https://www.theurlist.com/cholivar-runets-story

Детство и отрочество рунета. Бывшие советские программисты, живущие сейчас в Кремниевой долине, вспоминают о том, как устанавливали первую научную сеть на во.

Tproger для программистов

Интервью с веб-разработчиком Pornhub

Недавно веб-разработчик сайта Pornhub дал интервью, в котором рассказал об особенностях работы на сайте для взрослых, об используемых технологиях и трюках, которые позволяют удерживать пользователей на сайте.

Перевод интервью читайте на нашем сайте.

Tproger для программистов

Веб-страница — канал про веб-разработку.

Всё лучшее по фронтенду, бэкенду и девопсу в одном месте: @tproger_web

Tproger для программистов

КРОК — международная IT-компания с проектами в 40 странах мира.

Всем сотрудникам предоставляют:

— Комфортное рабочее место с мощным железом;
— Профессиональное развитие за счёт курсов и сертификаций;
— Корпоративный английский язык;
— ДМС с полным пакетом медицинских услуг;
— Фитнес-зал в офисе с различными программами от футбола до тенниса.

У них открыты вакансии в Москве, Питере и регионах. Зарплатная вилка от 120 000 до 240 000 ₽.

— JavaScript разработчик со знанием Vue. Для разработки пользовательских интерфейсов.
— Инженер-разработчик .NET. Участвовать в проектировании архитектуры решений.
— Ведущий разработчик DWH/ETL. Создавать информационно-аналитические системы и хранилища данных.

Tproger для программистов

Например, проектировать виртуальную реальность, создавать умные мониторинговые системы и программировать дронов. Про то, какие ещё есть задачи в промышленности и как вы можете их «потрогать», рассказывает эксперт из КРОК:

Tproger для программистов


​​Не хотите учить математику?

Да и не надо! Пусть другие получают вашу работу и зарплату в два раза больше 🙂

Годные курсы для тех, кому не всё равно:
tprg.ru/esli-ti-zhdal-znak-to-eto-on — поступите, пройдя вступительное тестирование.

Tproger для программистов

Как дела у Go и так ли популярен Python, как кажется — тренды языков программирования

Какие языки программирования набирают популярность? Какие находятся на пике своей популярности? Что думают по этому поводу эксперты?

Читайте выдержки из отчёта InfoQ за октябрь.

Зачем Go нужны дженерики

Полезные материалы по всему, что может быть полезно разработчику на Go.

About
Platform
Made by @FCK_RKN_bot Лучший прокси-бот для Telegram

Теории не бывает без практики, так и наоборот, поэтому учимся на примере, как пользоваться If/Else

​​#golang
Golang оснащен таким ключевым словом как «go» . С его помощью можно создавать goroutines. Не менее важно ставить их на паузу или отключать. Ни один запрос не может длиться вечно. Для этого был разработан Context package, который мы сейчас изучим.

​​#go
Пишем арканоид на Unity. Механика мяча и платформы

Статья из цикла о написании простой игры на Unity — классического арканоида.

Эффективное использование 2D инструментов, представляемые движком.

�� Переводим всё в Go с его широким функционалом. Реализуем простое решение и учимся использовать специальную волшебную строку.

​​Go модули с приватными Git репозиториями

Работаем с приватными репозиториями.
Модули значительно улучшили процесс управления зависимостями в Go. Довольно просто включить определенные версии пакетов Go из общедоступных репозиториев .
Что, если мы хотим расширить это поведение для импорта пакетов Go из приватных репозиториев ? На самом деле все довольно просто: убедитесь, что у вашего установщика Go есть доступ к приватным репозиториям Git. Но как мы можем это сделать?

​​Кросс-компиляция приложений
Знали ли вы, что разрабатывая приложение на Go на вашем MacBook, вам не обязательно собирать отдельную версию для Linux в отдельной OS, например? С этим прекрасно справится кросс-компиляция, доступная из коробки. Читайте подробный мануал по ссылке.

​​Пишем p2p мессенджер со сквозным шифрованием

Читать отзывы и документацию о языке не достаточно, чтобы научиться на нем писать более менее полезные приложения.
Обязательно для закрепления нужно создать что-то интересное, чтобы наработки можно было бы использовать в других своих задачах.
Статья ориентирована на новичков интересующихся языком go и пиринговыми сетями.

Пишем Static Blog Generator

Продолжаем тему самописного софта на примере SSGs ( static site generators). Вы, скорее всего, наслышаны о Hugo / Jekyll / Gatsby. Пришло время написать что-то свое, но с меньшим функционалом. Будем создавать генератор блогов. Поехали.

Сервисы на Go в Badoo: как мы их пишем и поддерживаем



Оказывается, в Badoo есть +-10 сервисов на Go. Разработчики рассказывают, как они все это поддерживают.
Написать такой сервис на Go очень просто: в стандартной библиотеке есть куча инструментов, а если чего-то и не хватает, то на Github есть много модных библиотек для удовлетворения большинства нужд.

Это статья о том, как введение дженериков может изменить Go и почему это будет целесообразным шагом. Здесь также будут затронуты изменения, которые придётся внести в язык для выполнения задуманного.

Локализация с помощью go-i18n

Библиотека, предоставляющая удобный API для выполнения задач локализации: от перевода файлов до полной автоматизации процедур.

​​Пишем нейросеть на Go с нуля

Сейчас вы научитесь создавать нейронную сеть на Go для решения задачи классификации. В нашем случае мы будем тренировать модель классифицировать цветы ириса, основываясь на известном датасете Фишера. Этого должно быть более чем достаточно, чтобы решить нашу задачу с большой точностью.

​​Разработка веб-серверов на Go — от простого к сложному

Эксклюзив от создателя, возможно, известного, возможно, нет, инструмента для пентестинга — Gopfish.

Go для DevOps, DevOps для Go

Сегодня Go стремительно приобретает популярность как язык будущего. Разбираемся, почему он идеально подходит для DevOps.
https://nuancesprog.ru/p/4773/

​​Шаблонизатор экселя для Go

Когда мы не хотим создавать что-то с нуля, мы пишем шаблонизаторы. Логично. Давайте сделаем это на Go, и нам не придется формировать документы вручную.

​​API клиент — это просто

Представьте, что вам нужно написать клиент, который будет обращаться к стороннему API (AWS/Twilio). Go все это может, но нужно знать, как воспользоваться нужными инструментами.

Хотели бы вы написать свою соцсеть? Если да, то приступайте к просмотру. Подробный видеоурок от создания протокола до написания клиента.

Что такое дженерики: доступные лекарства или аптечный мусор?

Что такое дженерики?

У дженериков сложные названия?

Почему люди предпочитают дженерики?

И не проводится никаких исследований?

И много дженериков на рынке?

А что насчёт их эффективности?

Почему дженерики могут быть менее эффективными?

Как отличить качественный дженерик?

Стоит ли использовать дженерики?

Почему дженерики такие дешёвые и можно ли ими лечиться.

Что такое дженерики?


Дженерик (англ. generic, воспроизведённое лекарство) — это лекарство-копия, которое совпадает с оригиналом по количеству действующего вещества и влиянию на организм.

Когда изобретают новое лекарство, его долго исследуют и тестируют, а потом оформляют патент. Когда срок патента заканчивается, другие компании тоже могут производить подобные лекарства — дженерики. Но в России права патентообладателей часто нарушаются О проблемах интеллектуальной собственности на лекарственном рынке , и дженерики регистрируются и продаются ещё до того, как закончится патент на оригинальное лекарство.

Мастер Йода рекомендует:  Изучаем LESS Общее описание системы

У дженериков сложные названия?

Не обязательно. У каждого лекарства несколько названий: химическое, международное непатентованное наименование (МНН) и торговое.

Химическое название — это непроизносимое словосочетание, которое ни о чём вам не говорит. МНН — это уникальное название действующего вещества, которое утверждается ВОЗ и обязательно указывается на упаковке препарата.

Кроме того, производитель лекарства может присвоить своему продукту торговое наименование, которое будет написано на упаковке крупными буквами.

  • Химическое название: 2-(2-(2,6-Дихлорфениламинo)фенил)уксусная кислота (в виде натриевой соли).
  • МНН: диклофенак.
  • Торговые наименования: «Вольтарен», «Вурдон», «Диклак», «Диклоберл», «Олфен», «Ортофен» и многие другие.

Почему люди предпочитают дженерики?

Потому что они гораздо дешевле. Прежде чем запатентовать новое лекарство, производители тратят огромные деньги на его разработку и тестирование, а это влияет на конечную стоимость. Процедура регистрации дженериков гораздо проще и быстрее. Этим и объясняется их дешевизна.

И не проводится никаких исследований?

По закону ст. 18 федерального закона от 12.04.2010 N 61-ФЗ (ред. от 28.12.2020) «Об обращении лекарственных средств» для регистрации дженерика вместо отчёта о собственных доклинических исследованиях можно предоставить обзор научных работ о результатах доклинических исследований воспроизводимого препарата, а вместо отчёта о собственных клинических исследованиях — отчёт о результатах исследований биоэквивалентности воспроизведённого лекарства.

Биоэквивалентность показывает степень и скорость всасывания, время достижения максимальной концентрации в крови, распределение в тканях и жидкостях организма, а также скорость выведения.

Так что исследования, доказывающие эффективность и безопасность нового дженерика, всё же проводятся, однако они не такие долгосрочные и дорогие, как в случае оригинального лекарства.

И много дженериков на рынке?

Согласно отчёту Фармацевтический рынок России, Декабрь 2020 аналитической компании DSM Group, в 2020 году на российском рынке было 86,2% дженериков. А это на 0,5% больше, чем в 2020-м.

20,1% из всех проданных дженериков — препараты, влияющие на пищеварительный тракт и обмен веществ, 14,2% — препараты для лечения заболеваний нервной системы, 14,0% — препараты для лечения заболеваний сердечно-сосудистой системы.

А что насчёт их эффективности?

Исследование Дженерики статинов: все ли так просто с доказательством клинической эквивалентности? 2012 года показало, что из четырёх дженериков симвастатина (препаратов для снижения холестерина в крови) только два полностью соответствуют оригиналу по безопасности и эффективности.

А в 2013 году выяснилось Safety and efficacy of generic drugs with respect to brand formulation , что за счёт сниженной эффективности дженерики могут увеличивать длительность лечения или вовсе не давать результата. С другой стороны, если увеличить дозу лекарства, чтобы ускорить лечение, можно вызвать негативные эффекты.

Получается настоящая лотерея: некоторые дженерики настолько же эффективны и безопасны, как и оригиналы, а другие могут продлить лечение и вызывать побочные эффекты.

Почему дженерики могут быть менее эффективными?

На эффективность препарата влияют многие факторы, в том числе степень очистки действующего вещества и дополнительные компоненты, которые могут содержать дженерики. Если компания закупает дешёвое действующее вещество, дженерик может быть недостаточно эффективен. А дополнительные компоненты могут вызывать аллергию или побочные эффекты.

Как отличить качественный дженерик?

В первую очередь можно ориентироваться по цене. Если препарат очень дешёвый даже по сравнению с другими дженериками, его производитель явно на чём-то сэкономил. Например, на качестве действующего вещества или на контроле при производстве.

Хороший показатель качества продукции: наличие сертификата GMP (Good Manufacturing Practice) у фармацевтического производства. Если у компании есть такой сертификат, значит, её продукция производилась в требуемых условиях (чистота, температура, влажность), в лекарство не попадают лишние вещества, оно упаковывается должным образом и сохраняет все свои свойства.


Стоит ли использовать дженерики?

Учитывая долю дженериков на российском рынке, можно сказать, что все мы когда-либо лечились такими препаратами и ничего страшного в этом нет. Дженерики делают лечение доступным для человека с любым доходом и обеспечивают терапевтический эффект и относительную безопасность.

Выписывая рецепт, врач указывает наименование действующего вещества, поэтому вы можете самостоятельно выбрать конкретный дженерик или оригинальный препарат (список оригинальных препаратов и их дженериков можно найти здесь). Часто доктор советует проверенный дженерик, в таком случае лучше его и использовать. Если же препарат даёт побочные эффекты, необходимо проконсультироваться с врачом: возможно, он назначит более дорогой дженерик или оригинальное лекарство.

[Перевод] Зачем нужны дженерики в Go?

Лучшие публикации за сутки.

Эта статья о том, что будет означать добавление дженериков в Go, и почему я считаю, что нам это следует сделать. Также я коснусь возможного изменения архитектуры языка ради добавления дженериков.

Go вышел 10 ноября 2009-го. Меньше чем через сутки появился первый комментарий про дженерики . В нём также упомянуты исключения, которые мы добавили в язык в виде паники и восстановления (panic and recover) в начале 2010-го.

За три года наблюдений отсутствие дженериков всегда входило список трёх главных проблем, которые необходимо исправить в языке.
Читать дальше →

Какими будут дженерики в Go?

В последнее время очень много критики о Голанге, потому что у него нет поддержки дженериков. Что именно это значит? Как бы вы объяснили это кому-то из динамически типизированного языка, такого как Ruby, где это не знакомая концепция?

На динамически типизированном языке вам все равно, какой тип списка он есть, просто это список. Однако на статически типизированном языке вам все равно, какой тип списка он есть, потому что тип — это «список A», где «A» — это какой-то тип. То есть, list A отличается от list B .

Поэтому, когда вы говорите о дженериках, вызывая некоторую функцию типа A -> B , каждый элемент списка с foreach означает, что список должен быть list A . Но. если вы используете дженерики, то вам не нужно объявлять, что A , вы можете просто заполнить его позже. Таким образом, вы устанавливаете контракт, в соответствии с которым задается list C и функция A -> B , A === C для ее компиляции. Это значительно уменьшает количество плитки.

В Go, учитывая отсутствие дженериков и возможность объявить такой контракт типа, вы должны написать функцию, которая работает в списке int, списке ******, списке строк и т.д. t просто определите вещи «общим» образом.

Уильям Б. Ягер сообщение в блоге напоминает почему «родовой» части, присутствующей в Go, недостаточно:

Вы можете написать общие функции достаточно легко. Скажем, вы хотели написать функцию, которая печатала хеш-код для объектов, которые можно было бы хэшировать. Вы можете определить интерфейс, который позволит вам сделать это с помощью гарантий безопасности статического типа, например:

Теперь вы можете указать любой объект Hashable на printHash , а также получить статическую проверку типа. Это хорошо.

Что делать, если вы хотите написать общую структуру данных? Пусть напишите простой Связанный список. Идиоматический способ написать общую структуру данных в Go:

(вот только начало)

«Правильный» способ построения общих структур данных в Go — это отличать вещи от верхнего типа, а затем помещать их в структуру данных. Так работала Java, примерно в 2004 году. Тогда люди поняли, что это полностью победит цель систем типов .

Когда у вас есть структуры данных, подобные этому, вы полностью устраняете любые преимущества, предоставляемые системой типов. Например, это вполне допустимый код:

Вот почему, если вы хотите сохранить преимущество системы типов, вам нужно использовать некоторую генерацию кода , чтобы сгенерировать код boileplate для вашего конкретного типа.

gen project является примером такого подхода:

gen генерирует код для ваших типов во время разработки, используя командную строку. gen не является импортом; сгенерированный источник становится частью вашего проекта и не принимает внешних зависимостей.

Обновление июня 2020 года: Дэйв Чейни подробно рассказал о том, что Generics for Go будет означать в его статьях «Простота долга» и » Simplicity Debt Redux».

Так как Go 2.0 теперь активно обсуждается на уровне базовой команды, Дэйв указывает, что включает в себя Generics, и это:

  • Обработка ошибок : Generic позволит монадическую обработку ошибок, то есть вам нужно понять монаду поверх остальные: позволяют обрабатывать вычислительный конвейер вместо проверки ошибок после каждого вызова функции. Но: вам нужно понять монаду!
  • Коллекции : упрощение создания пользовательских типов коллекций без необходимости использования интерфейса <> бокса и утверждения типа. Но это оставляет вопрос о том, что делать со встроенными средами и типами карт.
  • Нарезка . Уходит ли это, если да, то как это повлияет на общие операции, такие как обработка результата вызовом io.Reader.Read ? Если нарезка не исчезнет, ​​потребуются ли дополнительные перегрузки оператора, чтобы пользовательские типы коллекций могли реализовать оператор среза?
  • Вектор : тип массива типа Gos Pascal имеет фиксированный размер, известный во время компиляции. Как вы могли бы реализовать растущий вектор, не прибегая к небезопасным хакам?
  • Iterator : то, что вы действительно хотите сделать, — это создавать итераторы по результатам базы данных и сетевым запросам. Короче говоря, данные из-за пределов вашего процесса — и когда данные находятся вне вашего процесса, извлечение его может потерпеть неудачу. В этом случае у вас есть выбор, возвращает ли ваш Iterable интерфейс значение, значение и ошибка, или, возможно, вы сходите по маршруту типа опции.
  • Неизменность . Возможность отмечать функциональный параметр как const недостаточна, поскольку, пока он ограничивает приемник от изменения значения, он не запрещает вызывающему абоненту делать это, то есть большинство гонок данных, которые я вижу сегодня в программах Go. Возможно, то, что требует Go, — это не неизменность, а семантика собственности.


Сегодня появляются новые попытки учиться, в том числе Дарт, Мидори, Руст и Свифт.

Какими будут дженерики в Go?

В последнее время было много критики по поводу Голанга, потому что он не поддерживает дженерики. Что именно это означает? Как бы вы объяснили это кому-то из динамически типизированного языка, такого как Ruby, где это не знакомое понятие?

2 ответа

В динамически типизированном языке вас не волнует, что это за список, просто это список. Однако в статически типизированном языке вам все равно, какой это тип списка, потому что типом является «список A», где «A» — это какой-то тип. То есть list A отличается от list B

Мастер Йода рекомендует:  Как установить XAMPP и WordPress на Windows

Поэтому, когда вы говорите о дженериках, вызывая какую-то функцию типа A -> B каждый элемент списка с foreach означает, что список должен быть list A Но . если вы используете дженерики, то вам не нужно объявлять, что такое A , вы можете просто заполнить его позднее. Таким образом, вы устанавливаете контракт, в соответствии с которым предоставляется list C и функция A -> B , A === C для его компиляции. Это значительно уменьшает шаблон.

В Go, учитывая отсутствие обобщений и возможность объявлять такой контракт типа, вы должны написать функцию, которая работает со списком int, списком double, списком строк и т. Д. Вы не можете просто определить вещи в «родовом» стиле.

Сообщение в блоге Уильяма Б. Ягера напоминает, почему «общей» части, присутствующей в Go, недостаточно:

Вы можете написать общие функции достаточно легко.
Допустим, вы хотите написать функцию, которая печатает хеш-код для объектов, которые могут быть хешированы. Вы можете определить интерфейс, который позволяет вам делать это с гарантиями безопасности статического типа, например:

Теперь вы можете предоставить любой объект Hashable для printHash , а также получить статическую проверку типов. Это хорошо.

Что если вы хотите написать общую структуру данных?
Давайте напишем простой связанный список. Идиоматический способ написать общую структуру данных в Go:

(вот только начало)

«Правильный» способ построения общих структур данных в Go — привести объекты к верхнему типу и затем поместить их в структуру данных. Так работала Java примерно в 2004 году. Тогда люди поняли, что это полностью побеждало назначение систем типов .

Когда у вас есть подобные структуры данных, вы полностью исключаете любые преимущества, которые предоставляет система типов. Например, это совершенно правильный код:

Вот почему, если вы хотите сохранить преимущество системы типов, вы должны использовать некоторую генерацию кода , чтобы сгенерировать код кипы для вашего конкретного типа.

Проект gen является примером такого подхода:

gen разработки gen генерирует код для ваших типов с использованием командной строки.
gen не импорт; сгенерированный источник становится частью вашего проекта и не имеет внешних зависимостей.

Обновление, июнь 2020 года: Дейв Чейни подробно рассказал о значении Generics for Go в своих статьях « Простота долга » и « Простота долга Redux ».

Поскольку Go 2.0 сейчас активно обсуждается на уровне основной команды , Дейв указывает на то, что включает в себя Generics, а именно:

  • Обработка ошибок : Generic допускает монадическую обработку ошибок , что означает, что вам нужно понимать монаду поверх остальных: которые позволяют обрабатывать вычислительный конвейер вместо проверки ошибок после каждого вызова функции.
    Но: вам нужно понимать монаду!
  • Коллекции : упрощают настраиваемые типы коллекций без необходимости использовать интерфейс <> для упаковки и утверждения типов.
    Но это оставляет вопрос о том, что делать со встроенными срезами и типами карт.
  • Slicing : Уходит ли это, если так, как это повлияет на обычные операции, такие как обработка результата вызовом io.Reader.Read ?
    Если срезы не исчезнут, потребует ли это перегрузки операторов, чтобы пользовательские типы коллекций могли реализовывать оператор срезов?
  • Vector : Pascal-подобный тип массива Go имеет фиксированный размер, известный во время компиляции. Как вы могли бы реализовать растущий вектор, не прибегая к небезопасным взломам?
  • Итератор : вы действительно хотите иметь возможность создавать итераторы для результатов базы данных и сетевых запросов.
    Короче говоря, данные извне вашего процесса — и когда данные находятся за пределами вашего процесса, их получение может быть неудачным.
    В этом случае у вас есть выбор: возвращает ли ваш интерфейс Iterable значение, значение и ошибку, или, возможно, вы переходите по маршруту типа опции.
  • Неизменность . Возможность пометить параметр функции как const недостаточна, потому что, хотя она ограничивает получателя от изменения значения, она не запрещает вызывающей стороне делать это, что является большинством гонок данных, которые я вижу в программах Go сегодня.
    Возможно, что Go нуждается не в неизменности, а в семантике владения.

Сегодня есть новые попытки учиться, в том числе Дарт, Мидори, Руст и Свифт.

Последнее обсуждение — выпуск 15292, посвященный Го : в нем также упоминается « Краткое изложение общих обсуждений Го ».

Почему нет дженериков в Go?

отказ от ответственности: я только играл с Go в течение одного дня, так что есть хороший шанс, что я пропустил много.

кто-нибудь знает, почему нет реальной поддержки дженериков/шаблонов/whatsInAName в Go? Так что есть общий map , но это предоставлено компилятором, в то время как программист Go не может написать свою собственную реализацию. Со всеми разговорами о том, чтобы сделать Go максимально ортогональным, почему я могу использовать общий тип, но не создавать новый?


особенно когда он приходит к функциональному программированию, есть лямбды, даже замыкания, но с системой статического типа, лишенной дженериков, как я пишу, ну, общие функции более высокого порядка, такие как filter(predicate, list) ? Хорошо, связанные списки и тому подобное можно сделать с interface<> ущерба для безопасности типа.

как быстрый поиск на SO / Google не показал никаких идей, похоже, что дженерики, если вообще, будут добавлены, чтобы пойти в качестве запоздалой мысли. Я действительно доверяю Томпсону, чтобы сделать лучше, чем Java-ребята, но зачем держать дженерики вышел? Или они запланированы и просто еще не реализованы?

3 ответа:

Почему Go не имеет универсальных типов?

дженерики вполне могут быть добавлены в какой-то момент. Мы не чувствуем срочности для них, хотя мы понимаем, что некоторые программисты делают.

дженерики удобны, но они приходят по стоимости сложности в системе типов и времени выполнения. Мы еще не нашли дизайн, который дает значение пропорционально сложности, хотя мы продолжаем об этом думать. Между тем, встроенные карты и срезы Go, а также возможность использовать пустой интерфейс для создания контейнеров (с явной распаковкой) означают, что во многих случаях можно написать код, который делает то, что дженерики позволят, если менее гладко.

этот вопрос остается открытым.

есть проект дизайна для дженериков в https://blog.golang.org/go2draft.

Расс Кокс, один из ветеранов го написал сообщение в блоге под названием Общая дилемма, в которой он просит

. вам нужны медленные программисты, медленные компиляторы и раздутые двоичные файлы или медленное время выполнения?

медленные программисты, являющиеся результатом отсутствия дженериков, медленные компиляторы вызвано C++, как дженерики и медленное время выполнения вытекают из бокс-распаковки подхода, который использует Java.

четвертая возможность, не упомянутая в блоге, идет по маршруту C#. Создание специализированных кода как в C++, но во время выполнения, когда это необходимо. Мне это очень нравится, но Go очень отличается от C#, поэтому это, вероятно, вообще не применимо.

Я должен упомянуть, что с помощью популярного Java 1.4, как техника общее программирование в go что бросает в interface<> страдает точно такими же проблемами, как бокс-анбоксинг (потому что это то, что мы делаем), кроме потери времени компиляции тип безопасности. Для небольших типов (например, ints) Go оптимизирует interface<> введите так, чтобы список int, которые были приведены к интерфейсу <>, занимал смежную область памяти и занимал только в два раза больше места, чем обычные int. Есть еще накладные расходы на проверку времени выполнения при литье из interface<> , хотя. ссылка.

все проекты это добавляет общую поддержку go (есть несколько из них, и все они интересны) равномерно идут по маршруту C++ генерации кода времени компиляции.

несмотря на то, что дженерики в настоящее время не встроены, существует несколько внешних реализаций дженериков для go, которые используют комментарии в сочетании с небольшими утилитами, которые генерируют код.

Зачем нужны дженерики в аптеках?

Если впервые слышите о дженериках, то вам сюда. Сегодня поговорим об этих лекарственных препаратах. Дженерики имеют демократические цены и пользуются огромным спросом. Возможно, и вы их уже принимаете. Дженерики являются лекарственными препаратами без патента. Но они полностью идентичны оригиналу. То есть ничем не отличаются от препарата-оригинала и узнать подробнее можно узнать на https://dzhen8.ru/. Основное действующее вещество одинаковое, но вспомогательные компоненты могут отличаться.

Дженерик стоит дешевле своего оригинала. Так как не нужно тратиться на рекламу и технологию производства. Уже все готово. Название отличается на несколько букв и препарат итак известен. Это подделка лекарства, но качественная и легальная.

Дженерики по эффективности не отличаются от фирменных препаратов. Настоящий препарат сопровождается инструкцией и данными производителя.

Дженерики имеют хорошую цену и более доступны на рынке. Зачем платить в тридорога? Главное, чтобы лекарство помогало.

Производители оригиналов болезненно реагируют на дженерики. Ведь они составляют огромную конкуренцию на рынке спроса. Бывает, что дженерики становятся более эффективными и не имеют никаких побочных действий.Нужно уметь отличать дженерики от подделок. Ведь подделки лекарственных средств могут навредить здоровью. В подделке заменяют действующее вещество менее эффективным на более дешевый. Это может негативно сказаться. На российском рынке доля дженериков составляет 95% лекарств.

Не стоит бояться дженериков. Чтобы быть спокойным, покупать лекарства следует в крупных аптеках.

Дженерики Сиалиса: в чем его секрет популярности?

Как известно, многие мужчины в нынешнее время страдают от проблем с потенцией. О таких неприятностях не принято говорить в обществе, о них молчат, их скрывают от посторонних и даже иногда – от профессиональных врачей.

Но скрывать – не лучшее решение. Гораздо лучше будет просто обратиться в indiapharm.ru и найти там идеальный вариант, который поможет преодолеть все интимные трудности. Им для многих станет Дженерики Сиалиса. Активное вещество, которое входит в его состав, – Тадалафил.

Большинство новых разработок и исследований по всему миру позволили значительно увеличить действие самого Сиалиса. Современные ученые смогли добиться того, что Сиалис до целых 36 часов сохраняет свое действие. Кроме этого, специалисты еще и смогли освободить лекарство максимально от всех побочных эффектов, а это делает препарат поистине самым востребованным среди мужчин.

Кроме этого, на практике чаще всего именно Сиалис (он же еще как Тадалафил известен) дает наибольший и наилучший эффект у мужчин, страдающих диабетом. Сиалис, таким образом, является тем средством, который невероятно точно и столь же качественно воспроизводят непосредственно индийские фармацевты .

Добавить комментарий