Парадигма | Многопарадигма : одновременный, функциональный, императивный, объектно-ориентированный |
---|---|
Разработан | Робертом Гриземером. Робом Пайком. Кеном Томпсоном |
Разработчик | Перейти Авторы |
Впервые появилось | 10 ноября 2009 г.; 10 лет назад (2009-11-10) |
Стабильный выпуск | 1.15.3 / 14 октября 2020 г.; 10 дней назад (2020-10-14) |
Дисциплина печати | Предполагаемый, статический, сильный, структурный |
Язык реализации | Go, язык ассемблера (gc); C ++ (gccgo) |
OS | DragonFly BSD, FreeBSD, Linux, macOS, NetBSD, OpenBSD, Plan 9, Solaris, Windows |
Лицензия | BSD -стайл + патент grant |
Расширения имен файлов | .go |
Веб-сайт | golang.org |
Основные реализации | |
gc, gccgo | |
Под влиянием | |
Alef, APL, BCPL,C, CSP, Limbo, Modula, Newsqueak, Оберон, occam, Pascal, Smalltalk | |
Influenced | |
Crystal, Zig |
Go- статически типизированный , скомпилированный язык программирования, разработанный в Google Робертом Гриземером, Робом Пайком и Кен Томпсон. Go синтаксически похож на C, но с безопасностью памяти, сборкой мусора, структурной типизацией и CSP -стиль параллелизм. Этот язык часто называют Golang из-за его доменного имени, golang.org
, но собственное имя - Go.
Существует две основных реализации:
Сторонний транспилятор GopherJS компилирует. Перейдите к JavaScript для интерфейсной веб-разработки.
Go был разработан Google в 2007 году для повышения продуктивности программирования в эпоху многоядерные, сетевые машины и большие кодовые базы. Разработчики хотели ответить на критику других языков, используемых в Google, но сохранить их полезные характеристики:
Дизайнеры в первую очередь были мотивированы их общей неприязнью к C ++..
Go был публично объявлен в ноябре 2009 года, а версия 1.0 была выпущена в марте 2012 года. Go широко используется в производственной среде в Google и многих других организациях, а также в открытом доступе. - исходные проекты.
Gopher талисманВ ноябре 2016 года шрифты Go и Go Mono были выпущены шрифтовыми дизайнерами Чарльзом Бигелоу и Крисом Холмсом специально для использования от проекта Go. Go - это гуманистический шрифт без засечек, который напоминает Lucida Grande, а Go Mono - моноширинный. Каждый из шрифтов соответствует WGL4 набор символов и были разработаны, чтобы быть читаемыми с th большой x-height и четкие буквы. И Go, и Go Mono соответствуют стандарту DIN 1450 за счет того, что в них есть ноль с косой чертой, нижний регистр l
с хвостиком и верхний регистр I
с засечками.
В апреле В 2018 году оригинальный логотип был заменен на стилизованный наклонный вправо стилизованный GO с замыкающими линиями обтекаемости. Однако талисман Gopher остался прежним.
В августе 2018 года основные участники Go опубликовали два «черновика» для новых языковых функций, обобщенных и обработка ошибок и попросил пользователей Go оставить отзыв о них. Отсутствие поддержки общего программирования и многословность обработки ошибок в Go 1.x вызвали значительную критику.
Go 1 гарантирует совместимость спецификации языка и основных частей стандартной библиотеки. Все версии до текущего выпуска Go 1.15 сохранили это обещание.
Каждый основной выпуск Go поддерживается до двух новых основных выпусков.
Основная версия | Дата первоначального выпуска | Изменения языка | Другие изменения |
---|---|---|---|
1–1.0.3 | 28 марта 2012 г. | Первоначальный выпуск | |
1.1–1.1.2 | 2013- 05-13 |
|
|
1.2–1.2.2 | 01.12.2013 |
|
|
1.3–1.3.3 | 2014-06-18 | В этом выпуске нет языковых изменений. |
|
1.4–1.4.3 | 2014-12-10 |
|
|
1.5–1.5.4 | 2015-08-19 | По недосмотру правило, позволяющее исключить тип элемента из литералов среза, не было применено к ключам карты. Это было исправлено в Go 1.5. |
|
1.6–1.6. 4 | 17.02.2016 | В этом выпуске нет языковых изменений. |
|
1.7–1.7.6 | 2016-08-15 | Разъяснение по поводу завершающих операторов в спецификации языка. Это не меняет существующего поведения. |
|
1.8–1.8.7 | 2017-02-16 | При явном преобразовании значения из одного типа структуры в другой, начиная с Go 1.8, теги игнорируются. Таким образом, две структуры, которые отличаются только тегами, могут быть преобразованы из одной в другую. |
|
1.9–1.9.7 | 24.08.2017 |
| Компилятор Go теперь поддерживает параллельную компиляцию функций пакета, используя преимущества нескольких ядер. |
1.10–1.10.7 | 2018-02-16 |
| Для 64-битного порта x86 ассемблер теперь поддерживает 359 новых инструкций, включая полный AVX, AVX2, BMI, BMI2, F16C, FMA3, SSE2, SSE3, SSSE3, Наборы расширений SSE4.1 и SSE4.2. Ассемблер также больше не реализует |
1.11–1.11.6 | 24.08.2018 | В этом выпуске нет языковых изменений. |
|
1.12.1 | 25.02.2019 | В этом выпуске нет языковых изменений. |
|
1.13.1 | 2019-09-03 | Go теперь поддерживает более унифицированный и модернизированный набор префиксов числовых литералов |
|
1.14 | 2020-02-25 | Разрешает встраивание интерфейсов с перекрывающимися наборами методов | Поддержка модуля в команде |
1.15 | 2020-08-11 | В этом выпуске нет языковых изменений. |
Go создан под влиянием C, но с упором на большую простоту и безопасность. Язык состоит из:
x: = 0
вместо int x = 0;
или var x = 0;
).go get
) и онлайн пакетная документация.оператор select
.Синтаксис Go включает изменения по сравнению с C, направленные на сохранение краткости и удобочитаемости кода. Был введен комбинированный оператор объявления / инициализации, который позволяет программисту писать i: = 3
или s: = "Hello, world!"
, без указания типов используемых переменных. Это контрастирует с C's int i = 3;
и const char * s = "Hello, world!";
. Точки с запятой по-прежнему завершают операторы, но неявно используются, когда встречается конец строки. Методы могут возвращать несколько значений, и возвращая результат , пара err
- это обычный способ, которым метод указывает на ошибку вызывающему объекту в Go. Go добавляет буквальные синтаксисы для инициализации параметров структуры по имени и для инициализации карт и срезов. В качестве альтернативы трехэтапному оператору C для цикла
, выражения Go range
позволяют кратко перебирать массивы, срезы, строки, карты и каналы.
Go имеет ряд встроенных типов, включая числовые (byte, int64, float32 и т. Д.), логические и символьные строки (string). Строки неизменны; встроенные операторы и ключевые слова (а не функции) обеспечивают объединение, сравнение и кодирование / декодирование UTF-8. Типы записей могут быть определены с помощью ключевого слова struct.
Для каждого типа T и каждой неотрицательной целочисленной константы n существует массив типа, обозначенный [n] T; Таким образом, массивы разной длины относятся к разным типам. Динамические массивы доступны как «срезы», обозначенные T для некоторого типа T. Они имеют длину и емкость, определяющие, когда необходимо выделить новую память для расширения массива. Несколько слайсов могут совместно использовать свою базовую память.
Указатели доступны для всех типов, а тип указателя на T обозначается * T. При приеме адреса и косвенном обращении используются операторы и *, как в C, или неявно через вызов метода или синтаксис доступа к атрибуту. В стандартной библиотеке нет арифметики указателя, кроме специального типа unsafe.Pointer.
Для пары типов K, V тип map [ K] V - это тип хэш-таблиц, отображение типа- K ключей на тип- V значения. Хеш-таблицы встроены в язык со специальным синтаксисом и встроенными функциями. chan T - это канал, который позволяет отправлять значения типа T между параллельными процессами Go.
Помимо поддержки интерфейсов, система типов Go имеет номинальный : ключевое слово type может использоваться для определения нового именованного типа, который отличается от других именованных типов, имеющих такой же макет (в случае структуры те же элементы в том же порядке). Некоторые преобразования между типами (например, между различными целочисленными типами) предопределены, и добавление нового типа может определять дополнительные преобразования, но преобразования между именованными типами всегда должны вызываться явно. Например, ключевое слово type может использоваться для определения типа для адресов IPv4 на основе 32-битных целых чисел без знака:
type ipv4addr uint32
С этим определением типа ipv4addr (x) интерпретирует значение uint32 x как IP-адрес. Простое присвоение x переменной типа ipv4addr является ошибкой типа.
Выражения констант могут быть типизированными или «нетипизированными»; им присваивается тип при присвоении типизированной переменной, если значение, которое они представляют, проходит проверку во время компиляции.
Function Типы указываются ключевым словом func; они принимают ноль или более параметров и возвращают ноль или более значений, все из которых являются типизированными. Параметр и возвращаемые значения определяют тип функции; таким образом, func (string, int32) (int, error) - это тип функций, которые принимают строку и 32-битное целое число со знаком и возвращают целое число со знаком (ширины по умолчанию) и значение встроенный интерфейс типа error.
Любой именованный тип имеет связанный с ним набор методов . В приведенный выше пример IP-адреса можно добавить метод проверки, является ли его значение известным стандартом:
// ZeroBroadcast сообщает, является ли адрес 255.255.255.255. func (addr ipv4addr) ZeroBroadcast () bool {return addr == 0xFFFFFFFF}
Из-за номинальной типизации это определение метода добавляет метод к ipv4addr, но не к uint32. Хотя методы имеют особое определение и синтаксис вызова, отдельного типа метода не существует.
Go предоставляет две функции, которые заменяют наследование классов.
Первая - это встраивание, которое можно рассматривать как автоматизированную форму композиции или делегирования.
. Второй - это его интерфейсы, которые обеспечивают полиморфизм времени выполнения. Интерфейсы представляют собой класс типов и обеспечивают ограниченную форму структурной типизации в системе номинальных типов Go. Объект, который относится к типу интерфейса, также относится к другому типу, подобно объектам C ++, которые одновременно являются базовым и производным классами. Интерфейсы Go были разработаны на основе протоколов языка программирования Smalltalk. Во многих источниках при описании интерфейсов Go используется термин duck typing. Хотя термин «утиная типизация» не определен точно и, следовательно, не является неправильным, он обычно подразумевает, что соответствие типа не проверяется статически. Поскольку соответствие интерфейсу Go проверяется статически компилятором Go (кроме случаев, когда выполняется утверждение типа), авторы Go предпочитают термин структурная типизация.
В определении типа интерфейса перечислены необходимые методы по имени и типу. Любой объект типа T, для которого существуют функции, соответствующие всем требуемым методам интерфейса типа I, также является объектом типа I. Определение типа T не обязательно (и не может) идентифицировать тип I. Например, если Форма, Квадрат и Круг определены как
импорт "математического" типа Интерфейс формы {Area () float64} type Square struct {// Примечание: нет объявления "реализует" сторона float64} func (sq Square) Area () float64 {return sq.side * sq.side} type Circle struct {// здесь также нет объявления "реализует" radius float64} func (c Circle) Area () float64 {return math.Pi * math.Pow (c.radius, 2)}
тогда и Square, и Circle неявно являются Shape и может быть назначен переменной типа Shape. На формальном языке интерфейсная система Go обеспечивает структурную, а не номинальную типизацию. Интерфейсы могут встраивать другие интерфейсы с эффектом создания комбинированного интерфейса, которому удовлетворяют именно типы, реализующие встроенный интерфейс, и любые методы, которые добавляет новый определенный интерфейс.
Стандартная библиотека Go использует интерфейсы для обеспечения универсальности в нескольких местах, включая систему ввода / вывода, основанную на концепциях Reader и Writer.
Помимо вызова методов через интерфейсы, Go позволяет преобразовывать значения интерфейса в другие типы при запуске -время проверки типа. Для этого используются языковые конструкции: утверждение типа, которое проверяет один потенциальный тип, и переключатель типа, который проверяет несколько типов.
Пустой интерфейс interface {}
является важный базовый вариант, потому что он может относиться к элементу любого конкретного типа. Онаналогичный классу Объект в Java или C # и удовлетворяется любым типом, включая встроенные типы, такие как int. Код, использующий пустой интерфейс, не может просто вызвать методы (или встроенные операторы) для объекта, но он может сохранить значение интерфейс {}
, попытаться преобразовать его в более полезный тип с помощью Утверждения типа или переключатель типа, либо проверьте его с помощью пакета Go Reflection
. Интерфейс {}
может ссылаться на любое значение, это ограниченный способ избежать ограничений статической типизации, таких как void *
в C, но с дополнительными проверками типов во время выполнения.
Тип интерфейс {}
может обозначать для моделирования структурированных данных любой произвольной схемы в Go, например данных JSON или YAML, или Terraform ресурсы, представляя их как карта [строка] интерфейс {}
(строка строки на интерфейс). Это рекурсивно указанные данные в форме словаря со строковыми ключами и значениями любого типа.
Значения интерфейса реализуются с использованием указателя на данные и второго указателя информации о типе выполнения. Как и некоторые другие типы, реализованные с использованием указателей в Go, значения интерфейса равны нет
, если он не инициализирован.
В системе пакетов Go каждый пакет имеет путь (например, "compress / bzip2"
или "golang.org/x/net/html "
) и имя (например, bzip2
или html
). Ссылки на определения других пакетов всегда должны начинаться с имени другого пакета, и доступны только имена с заглавной буквы из других пакетов: io.Reader
является общедоступным, а bzip2.reader
- нет.. Команда go get
может извлекать пакеты, хранящиеся в удаленном репозитории, разработчикам рекомендуется разрабатывать пакеты внутри базового пути, соответствующий исходному репозиторию (например, example.com/user_name/package_name), чтобы уменьшить вероятность конфликта имен с будущими дополнениями к стандартной библиотеке или другим библиотекам.
Существуют предложения по внедрению подходящего решения для управления пакетами для Go, аналогичного CPAN для Perl или грузовой системы Rust или Система npm узла.
На языке Go есть встроенные средства, а также поддержка библиотек для написания параллельных программ. Параллелизм относится не только к параллелизму ЦП, но и к асинхронности : позволяет выполнять медленные операции, такие как чтение базы данных или сеть, в то время как программа выполняет другую работу, как это часто бывает на серверах, основанных на событиях.>Первичная конструкция параллелизма - это горутина, тип облегченного процесса. Вызов функции с префиксом go
запускает функцию в новой горутине. В спецификации языка не указано, как должны быть реализованы горутины, но текущие реализации мультиплексируют горутины процесса Go в меньший набор потоков операционной системы, аналогично планированию, выполняемому в Erlang.
Хотя стандартный пакет библиотеки, предоставленный большинство классических структур управления параллелизмом (мьютекс блокировки и т. д.), идиоматические параллельные программы вместо этого предпочитают каналы, которые предоставляют сообщения отправкой Между горутинами. Дополнительные буферы сообщения в порядке FIFO и позволяют отправлять горутины до того, как их сообщения будут получены.
Каналы типизированы, так что канал типа chan T может сообщить только сообщение типа T. Для работы с ними используется специальный синтаксис; <-ch is an expression that causes the executing goroutine to block until a value comes in over the channel ch, а ch <- x sends the value x (возможно, блокировка до тех пор, пока другая горутина не получит значение). Встроенный оператор, подобному переключателю select, местная установка для реализации реализации связи по нескольким каналам; см. ниже для примера. В Go есть модель памяти, описывающая, как горутины должны использовать каналы или другие операции для безопасного обмена данными.
Существование каналов отличает Go от модели акторов параллельных языков, таких как Erlang, где сообщения адресованы непосредственно актерам (соответствующие горутинам). Стиль актера можно смоделировать в Go, поддерживая взаимно однозначное соответствие между горутинами и каналами, но язык позволяет нескольким горутинам совместно использовать канал или один горутине для отправки и приема по нескольким каналам.
С помощью этих инструментов можно создавать параллельные конструкции, такие как рабочие пулы конвейеров (в которых, скажем, файл распаковывается и анализируется по мере), фоновые вызовы с тайм-аутом, параллельные вызовы «разветвления» к набору службы и другие.. Каналы также нашли применение, выходящее за рамки обычного понятия межпроцессного взаимодействия, например, использование в качестве безопасного для параллелизма списка переработанных буферов, реализация сопрограмм (которые помогли вдохновить название горутины) и реализация итераторов.
Связанные с параллелизмом структурные соглашения Go (каналы и альтернативные входы каналов) получены из модели Тони Хоара последовательных последовательных процессов. В отличие от предыдущих языков параллельного программирования, таких как Occam или Limbo (язык, на котором работал соавтор Go Роб Пайк), Go не использует встроенного понятия безопасного или проверяемого параллелизма.. Хотя в Go отдается предпочтение модели взаимодействующих процессов, она не единственная: все горутины в программе используют одно адресное пространство. Это означает, что изменяемые объекты. см. § Отсутствие безопасности состояния гонки ниже.
Хотя функции параллелизма Go не нацелены в первую очередь на параллельную обработку, их можно использовать для программирования общей памяти многопроцессорные машин. Были проведены различные исследования эффективности этого подхода. В одном из этих исследований сравнивали размер (в строках кода ) и скорость программ, написанным опытным программистом, не знакомым языком, и исправления этих программ экспертом Go (из группы разработчиков Google), выполняя то же самое для Часовня, Силк и Intel TBB. Исследование показало, что неспециалисты склонны писать алгоритмы разделяй и властвуй с одним оператором перейти на рекурсию, в то время как эксперт писал программы распределения-работы-синхронизации, используя одну горутину на процессор. Программы эксперта обычно были быстрее, но также и длиннее.
Нет никаких ограничений на то, как горутины получить доступ к используемым данным, что делает возможными состояния гонки. В частности, если программа явно не синхронизируется через каналы или другие средства, записи из одной горутины могут быть частично, полностью или вообще не видимы для другого, часто без каких-либо гарантийных порядков записи. Эти структуры, внутренние структуры данных Go, такие как значения интерфейса, заголовки фрагментов, хэш-таблицы и заголовки строк, не защищены от условий гонки, поэтому безопасность и типы могут нарушены в многопоточных программах, которые изменяют общие экземпляры этих без типов. Вместо языковой поддержки параллельное программирование, таким образом опирается на соглашение; например, Chisnall рекомендует иди полученное значение под названием «aliases xor mutable», означающую, что передачу изменяемого значения (или указателя) по каналу сигнализирует о передаче права собственности на его сигналу.
Компоновщик в инструментальной цепочке gc по умолчанию создает статически связанные двоичные файлы, поэтому все двоичные файлы Go включают среду выполнения Go.
Go намеренно опускает некоторые функции, общие на другие языки, включая (реализация) наследование, общее программирование, утверждение, арифметика указателя, неявное преобразование типов, объединение без тегов и объединение с тегами. Дизайнеры добавили только те возможности, которые согласовались всеми тремя.
Из пропущенных языковых функций разработчики явно возражают против утвержденных утверждений и арифметики указателей, защищенных при этом выборе использования режима более полезного языка, использования вместо этого использования интерфейса для достижения динамической отправка и композиция для повторного использования кода. Состав и делегирование фактически в степени автоматизированы с помощью встраивания структуры; по мнению исследователей Шмагер и др., эта функция имеет много недостатков наследования: она влияет на общедоступный интерфейс объектов, она не является мелкозернистой (т.е. отсутствует контроль внедрения на уровне метода), методы встроенных объектов не могут быть скрытым и статичным Программисты, которые делают «неочевидным», принимают программисты, злоупотребляют им в такой степени, что программисты на других языках, как считается, злоупотребляют наследованием.
Дизайнеры рассматривают открытость к общему программированию. Пайк называет это слабостью, которую в какой-то момент можно изменить. Команда Google создала по крайней мере один компилятор для экспериментального диалекта Go с дженериками, но не выпустила его. Они также открыты для стандартизации способов применения генерации кода. В июне 2020 года был опубликован новый черновой проект документа, необходимый синтаксис для общих функций и типов. Инструмент преобразования кода go2go был предоставлен, чтобы позволить пользователям опробовать новый синтаксис вместе с версией онлайн-игры Go Playground с поддержкой универсальных шаблонов.
Первоначально опущено, исключение -подобный механизм panic / восстановления был в конечном итоге добавлен, который авторы Go советуют использовать для неисправимых ошибок, таких как те, которые должны остановить всю программу или запрос сервера, или как ярлык для распространения ошибок вверх по стеку внутри
Авторы Go приложили значительные усилия, чтобы повлиять на стиль программ Go:
gofmt
. golint
выполняет дополнительные проверки стиля автоматически.godoc
), тестирование (go test
), сборка (go build
), управление пакетами (go get
) и т. Д.map
и в стиле Java try
/ finally
блоков) имеет тенденцию поощрять конкретный явный, конкретный и императивный стиль программирования.Основной дистрибутив Go включает инструменты для сборки, тестирования и анализ кода :
go build
, который строит двоичные файлы Go, используя только информацию из самих исходных файлов, без отдельных make-файловgo test
, для модуля тестирование и микробенчмаркиgo fmt
, для форматирования кодаgo get
, для получения и установки удаленных пакетовgo vet
, статический анализатор, ищущий потенциальные ошибки в кодеgo run
, ярлык для создания и выполнения кодаgodoc
, для отображения документации или обслуживания ее через HTTPgorename
, для переименования переменных, функций и т. д. в типе -безопасный способgo generate
, стандартный способ вызова генераторов кодаОн также включает поддержку профилирования и отладки, инструментарий времени выполнения (например, чтобы отслеживать сборку мусора паузы) и тестер состояния гонки.
Экосистема сторонних инструментов добавляет к стандартному распространению, например gocode
, который позволяет автозаполнение кода во многих текстовых редакторах, goimports
, который автоматически добавляет / удаляет импорт пакетов по мере необходимости и errcheck
, который обнаруживает код, который может непреднамеренно игнорировать ошибки.
основной импорт пакета "fmt" func main () {fmt.Println ("Hello, world!")}
где "fmt" - это пакет для форматированного ввода / вывода, аналогичный C C файла ввода / вывода.
Следующая простая программа демонстрирует функции параллелизма в Go для реализации асинхронная программа. Он запускает два легких потока («горутины»): один ожидает, пока пользователь наберет текст, а другой реализует тайм-аут. Оператор выбора ожидает, пока одна из этих горутин отправит сообщение в основную процедуру, и воздействует на первое поступившее сообщение (пример адаптирован из книги Дэвида Чиснолла).
основной импорт пакета ("fmt" "время ") func readword (ch chan string) {fmt.Println (" Введите слово, затем нажмите Enter. ") var word string fmt.Scanf ("% s ", word) ch <- word } func timeout(t chan bool) { time.Sleep(5 * time.Second) t <- false } func main() { t := make(chan bool) go timeout(t) ch := make(chan string) go readword(ch) select { case word := <-ch: fmt.Println("Received", word) case <-t: fmt.Println("Timeout.") } }
Пример целевой функции:
func ExtractUsername (строка электронной почты) строка {at: = strings.Index (email, "@") return email [: at]}
Тестовый код (обратите внимание, что assert ключевое слово отсутствует в Go; тесты находятся в
import ("testing") func TestExtractUsername (t * testing.T) {t.Run ("withoutDot", func ( t * testing.T) {username: = ExtractUsername ("[email#160;protected] ") if username! = "r" {t.Fatalf ("Got:% v \ n", username)}}) t.Run ( "withDot", func (t * testing.T) {username: = ExtractUsername ("jonh.smith @ example.com") if username! = "jonh.smith" {t.Fatalf ("Got:% v \ n", имя пользователя)}})}
Можно зап ускать тестирование параллельно.
Некоторые известные приложения с открытым исходным кодом, написанные на Go, включая:
Другое Известные компании и сайты, использующие Go (как правило, вместе с другими языками, а не исключительно), включает:
Система пробного использования наследования, которая сравнила эти характеристики с характеристиками Стандартный ML, называя это «позором, что ни один популярный язык не пошел по [этому] конкретному конкретному ».
Дэйв Эстелс с Engine Yard написал:
Перейти очень легко погрузиться в. Существует минимальное количество фундаментальных языковых концепций, а синтаксис ясен и однозначен. Иди все еще экспериментальным и все еще немного грубым.
Go был назван языком программирования года по версии Индекса сообщества программистов TIOBE в первый год, 2009, за более крупный 12-месячный период. его популярность выросла (всего за 2 месяца после его появления в ноябре) по сравнению с любым другим языком в том же году и к январю 2010 года достигла 13-го места, обогнав такие известные языки, как Паскаль. К июню 2015 года его рейтинг опустился ниже 50-го места в рейтинге, став ниже COBOL и Fortran. Но по состоянию на январь 2017 года его рейтинг поднялся до 13-го года, что указывает на значительный рост места и принятия. Go был удостоен награды TIOBE как язык программирования 2016 года.
Брюс Эккель Заявлено:
Сложность C ++ (в новом C ++ добавлено еще больше сложности) и результирующее влияние на производительность больше не оправдано. Все трудности, которые пришлось преодолеть программисту C ++, чтобы использовать C-совместимый язык, больше не имеют смысла - они просто пустая трата времени и усилий. Go имеет гораздо больше смысла для класса проблем, для решения которых изначально предназначался C ++.
Оценка языка и его реализации gc в 2011 году по сравнению с C ++ (GCC ), Java и Scala инженером Google обнаружено:
Go предлагает интересные языковые функции, которые также позволяют создавать краткие и стандартизованные обозначения. Компиляторы для этого языка все еще незрелы, что отражается как в производительности, так и в размере двоичного кода.
— Р. HundtЭта оценка получила опровержение от команды разработчиков Go. Ян Лэнс Тейлор, улучшивший код Go для статьи Хундта, не знал о намерении опубликовать свой код и говорит, что его версия «никогда не предназначалась для того, чтобы быть примером идиоматического или эффективного Go»; Затем Расс Кокс оптимизировал код Go, а также код C ++, и заставил код Go работать немного быстрее, чем C ++, и более чем на порядок быстрее, чем код в статье.
10 ноября 2009 г., в день общего выпуска языка, Фрэнсис МакКейб, разработчик Go! язык программирования (обратите внимание на восклицательный знак), запросил изменение названия языка Google, чтобы избежать путаницы с его языком, на разработку которого он потратил 10 лет. МакКейб выразил обеспокоенность тем, что «большой парень» в конечном итоге обрушится на него », и это беспокойство нашло отклик у более чем 120 разработчиков, которые прокомментировали официальную ветку проблем Google, говоря, что им следует изменить имя, а некоторые даже сказали, что проблема противоречит девизу Google: Не будь злом.
12 октября 2010 г. разработчик Google Расс Кокс (@rsc) закрыл вопрос с пользовательским статусом «Несчастный», сопровождаемым следующим комментарием:
«Есть много компьютерных продуктов и услуг под названием Go. За 11 месяцев, прошедших с момента нашего выпуска, произошло минимальное смешение двух языков».
Критики Go говорят, что:
На Викискладе есть материалы, связанные с Go (язык программирования). |