Sun . 20 Feb 2020

Go (язык программирования)

Go, часто называемый golang, является свободным языком программирования с открытым исходным кодом [12], созданным в Google [13] в 2007 году Робертом Гриземером, Робом Пайком и Кеном Томпсоном [10]. Это скомпилированный статически типизированный язык в традиции Algol и C, с сборкой мусора, ограниченной структурной типизацией, [3] функциями безопасности памяти и функциями параллельного программирования в стиле CSP [14]
Язык был объявлен в ноябре 2009 года; он используется в некоторых производственных системах Google [15], а также другими фирмами. Существуют две основные реализации: компилятор Google Go, «gc», разработан как программное обеспечение с открытым исходным кодом и предназначен для различных платформ, включая Linux, OS X, Windows, различные версии BSD и Unix, а с 2015 года также мобильные устройства, включая смартфоны [16] Второй компилятор, gccgo, является внешним интерфейсом GCC [17] [18] Инструментальная цепочка "gc" является самостоятельной, начиная с версии 15 [19]
Содержание
1 История
2 Языковой дизайн
21 Критика
22 Синтаксис
23 Типы
231 Система интерфейсов
24 Система пакетов
25 Параллелизм: процедуры и каналы
251 Пригодность для параллельного программирования
252 Отсутствие безопасности в условиях гонки - 26 Пропуски
3 Условные обозначения и стиль кода
4 Языковые инструменты
5 Примеры
51 Hello world
52 Пример параллелизма
6 Проекты, использующие Go
7 Прием
8 Спор об именах
9 См. Также
10 Примечания
11 Ссылки
12 Внешние ссылки
121 Сообщество и конференции
История
Go orig начатый в качестве эксперимента инженерами Google Робертом Гриземером, Робом Пайком и Кеном Томпсоном для разработки нового языка программирования, который бы разрешал общую критику других языков при сохранении их положительных характеристик [20] Новый язык должен был: - быть статически типизированным - масштабируемо для больших систем, таких как Java и C ++; - быть продуктивным и читабельным, без слишком большого количества обязательных ключевых слов и повторений [21], как динамические языки, «освещать страницу»;
не требует инструментов, но хорошо его поддерживает,
поддержка сетей и многопроцессорности
В более поздних интервью все трое разработчиков языка назвали свою общую неприязнь к сложности C ++ в качестве основной мотивации для разработки нового языка [22] [23] [24]
Go 10 был выпущен в марте 2012 года [25]. В Go 17 добавлено «одно крошечное изменение языка» [26] и один порт для macOS 1012 Sierra плюс несколько экспериментальных портов, например, для Linux на z Systems linux / s390x Применяются некоторые изменения библиотеки, и например, теперь поддерживается Unicode 90
Дизайн языка
Go is recog очевидно, в традиции C, но вносит много изменений для улучшения краткости, простоты и безопасности. Ниже приводится краткий обзор возможностей, которые определяют Go:
Синтаксис и среда, принимающие шаблоны, более распространенные в динамических языках: [27]
Необязательное краткое объявление и инициализация переменных с помощью вывода типа x: = 0, а не var x int = 0;
Быстрое время компиляции [28]
Удаленное управление пакетами go get get [29] и онлайн-документация по пакетам [30]
Отличительные подходы к конкретным проблемам:
Встроенные примитивы параллелизма: легковесные процессы, каналы и оператор выбора.
Интерфейсная система вместо виртуального наследования и внедрения типов вместо не виртуальных. наследование
Инструментальная цепочка, которая по умолчанию создает статически связанные нативные двоичные файлы без внешних зависимостей
Желание сделать спецификацию языка достаточно простой, чтобы ее можно было держать в голове программиста, [31] частично за счет исключения возможностей, общих для аналогичных языков.
критик ism
Go критики утверждают, что: отсутствие обобщений во время компиляции приводит к дублированию кода, метапрограммирование не может быть проверено статически [32] [33], а стандартная библиотека не может предлагать универсальные алгоритмы [34] - отсутствие языка расширяемость за счет, например, перегрузки операторов делает некоторые задачи более многословными [32] [35] из-за отсутствия системы типов типизации Хиндли-Милнера, препятствующей безопасности и / или выразительности [36] [37] из-за пауз и накладных расходов сборки мусора GC ограничивают использование Go в системном программировании по сравнению с языками с ручным управлением памятью [32] [36]
Разработчики языка утверждают, что эти компромиссы важны для успеха Go, [38] и объясняют некоторые конкретные решения в длина, [39] хотя они и выражают открытость к добавлению некоторой формы общего программирования в будущем, и к прагматическим улучшениям в таких областях, как стандартизация способов применения генерации кода [40] Что касается GC, защитники Go указывают на сокращение времени паузы в дальнейшем версии [41], например, Go 16, в то время как подтверждение g их алгоритм GC не сложен в реальном времени. Синтаксис
Синтаксис Go включает в себя изменения по сравнению с C, направленные на обеспечение краткости и читабельности кода. Был введен комбинированный оператор объявления / инициализации, позволяющий программисту писать i: = 3 или s : = "некоторые слова", без указания типов переменных Это контрастирует с C int i = 3; и const char s = "несколько слов"; Точки с запятой по-прежнему завершают операторы, но неявны, когда они встречаются в конце строки. Функции могут возвращать несколько значений, и, возвращая результат, пара ошибок - это обычный способ, которым функция указывает на ошибку вызывающей функции в Go [a] Go добавляет буквальные синтаксисы для инициализации параметров структуры по имени, а также для инициализации карт и фрагментов. В качестве альтернативы циклическому выражению C для выражений диапазона выражения Go допускают краткую итерацию по массивам, фрагментам, строкам, картам и каналам. Типы
Go имеет ряд встроенных типов, в том числе числовые byte, int64, float32 и т. д., логические и символьные строки string Строки являются неизменяемыми; встроенные операторы и ключевые слова, а не функции обеспечивают конкатенацию, сравнение и кодирование и декодирование UTF-8 [42] Типы записей могут быть определены с помощью ключевого слова struct. Для каждого типа T и каждой неотрицательной целочисленной константы n существует тип массива, обозначенный [n] T; Таким образом, массивы разной длины имеют разные типы. Динамические массивы доступны в виде «срезов», обозначаемых [] T для некоторого типа T. Они имеют длину и емкость, определяющие, когда необходимо выделить новую память для расширения массива. Несколько срезов могут совместно использовать свои базовая память [43] [44] [45]
Указатели доступны для всех типов, а указатель на тип T обозначается как T-захват адреса и косвенное использование с помощью & amp; и операторы, как в C, или происходят неявно через синтаксис вызова метода или доступа к атрибуту. [46] Арифметика указателей отсутствует, за исключением специального типа unsafePointer в стандартной библиотеке. Для пары типов K, V тип map [K] V - это тип хеш-таблиц, отображающий ключи типа K на значения типа V Хеш-таблицы встроены в язык со специальным синтаксисом и встроенными функциями. chan T - это канал, который позволяет передавать значения типа T между Параллельные процессы Go
Помимо поддержки интерфейсов, система типов Go является номинальной: ключевое слово type можно использовать для определения нового именованного типа, который отличается от других именованных типов, имеющих такое же расположение в случае структуры. одни и те же члены в одном и том же порядке. Некоторые преобразования между типами, например, между различными целочисленными типами, предварительно определены, и добавление нового типа может определить дополнительные преобразования, но преобразования между именованными типами всегда должны вызываться явно [47]. Например, ключевое слово type можно использовать для определения Если тип для адресов IPv4, представляющих собой 32-разрядные целые числа без знака: тип ipv4addr uint32
С этим определением типа ipv4addrx интерпретирует значение uint32 x как IP-адрес. Простое назначение x переменной типа ipv4addr является ошибка типа
Выражения констант могут быть типизированными или нетипизированными; им присваивается тип при назначении типизированной переменной, если значение, которое они представляют, проходит проверку во время компиляции [48]. Типы функций указываются ключевым словом func; они принимают ноль или более параметров и возвращают ноль или более значений, все из которых являются типизированными. Параметр и возвращаемые значения определяют тип функции; таким образом, funcstring, int32 int, error - это тип функций, которые принимают строку и 32-разрядное целое число со знаком и возвращают целое число со знаком со шириной по умолчанию и значение ошибки встроенного типа интерфейса
Любой именованный тип имеет набор методов, связанных с ним. Приведенный выше пример IP-адреса может быть дополнен методом преобразования адреса в удобочитаемое представление, а именно:
// Это нулевой широковещательный адрес 255255255255
func addr ipv4addr ZeroBroadcast bool
Из-за именной типизации это определение метода добавляет метод в ipv4addr, но не в uint32. Хотя методы имеют специальное определение и синтаксис вызова, нет определенного типа метода [49]
Интерфейсная система
Go предоставляет две функции, которые заменяют наследование классов
Первый - это встраивание, которое можно рассматривать как автоматизированную форму композиции [50] или делегирования [51]: 255
Второй - это его интерфейсы, которые обеспечивают полиморфизм во время выполнения [52] : 266 Интерфейсы обеспечивают ограниченную форму структурной типизации в других se Номинальная система типов Go Любой тип, который реализует все методы интерфейса, соответствует этому интерфейсу. Интерфейсы Go были разработаны после протоколов языка программирования Smalltalk [53]. В нескольких источниках при описании интерфейса Go используется термин «утиная типизация» [54] [55]. Хотя термин «типизирование утки» точно не определен и, следовательно, не является ошибочным, он обычно подразумевает, что соответствие типов не проверяется статически. Поскольку соответствие интерфейсу Go проверяется статически компилятором Go, за исключением случаев, когда выполняется утверждение типа, авторы Go предпочитают использовать термин структурная типизация
Интерфейс определяет набор типов, перечисляя требуемые методы и их типы, и удовлетворяется любым типом, который имеет требуемые методы. Типы реализации не должны указывать реализацию интерфейсов, поэтому если Shape, Square и Круг определены как: импорт "математика"
тип Интерфейс формы
тип Квадратная структура
func sq Квадратная площадь float64 - тип Круговая структура
func c Circl e Area float64
тогда Square и Circle неявно являются Shape и могут быть назначены переменной с типом Shape [52]: 263–268 На формальном языке система интерфейса Go обеспечивает структурную, а не номинальную типизацию. Интерфейсы могут внедрять другие интерфейсы с эффектом создания комбинированного интерфейса, который удовлетворяется точно типами, которые реализуют встроенный интерфейс, и любыми методами, которые добавляет вновь определенный интерфейс [52]: 270
Стандартная библиотека Go использует интерфейсы для обеспечения универсальности в нескольких местах, включая систему ввода / вывода, основанную на концепциях Reader и Writer [52]: 282–283
Помимо вызова методов через интерфейсы, Go позволяет преобразовывать значения интерфейса в другие типы с проверкой типов во время выполнения. Языковые конструкции для этого используются утверждение типа [56], которое проверяет один потенциальный тип, и переключатель типа [57], который проверяет несколько типов
Пустой интерфейсный интерфейс является важным угловым случаем, поскольку он может ссылаться на для элемента любого конкретного типа. Он похож на класс Object в Java или C #, но с той разницей, что пустой интерфейс удовлетворяется любым типом, включая встроенные типы, такие как int, в то время как в Java и C #, переменная Object может хранить только экземпляры ссылочного типа [52]: 284 Код, использующий пустой интерфейс, не может просто вызывать методы или встроенные операторы для объекта, на который ссылаются, но он может хранить значение интерфейса, пытаться преобразовать его в более полезный тип через утверждение типа или переключение типа, или проверить его с помощью пакета рефлекса Go [58]. Поскольку интерфейс может ссылаться на любое значение, это ограниченный способ избежать ограничений статической типизации, таких как void в C, но с дополнительными проверками типов во время выполнения.
Значения интерфейса реализованы с использованием указателя на данные и второго указателя на информацию о типе времени выполнения [59] Как и некоторые другие типы, реализованные с использованием указателей в Go, значения интерфейса равны нулю, если они не инициализированы [60]
Система пакетов
В системе пакетов Go каждый пакет имеет путь, например, "c ompress / bzip2 "или" golangorg / x / net / html "и имя, например, bzip2 или html Ссылки на определения других пакетов всегда должны начинаться с префикса с именем другого пакета, и доступны только заглавные имена из других пакетов: ioReader общедоступна, но bzip2reader не [61] Команда go get может получить пакеты, хранящиеся в удаленном репозитории, таком как GitHub, [62], и разработчикам рекомендуется разрабатывать пакеты внутри базового пути, соответствующего исходному репозиторию, например githubcom / user_name / имя_пакета для уменьшения вероятности конфликта имен с будущими добавлениями в стандартную библиотеку или другие внешние библиотеки [63]. Существуют предложения по внедрению правильного решения для управления пакетами для Go, аналогичного грузовой системе Rust или системе npm в Node [64]
Параллелизм: подпрограммы и каналы
Язык Go имеет встроенные средства, а также поддержку библиотек для написания параллельных программ. Параллелизм относится не только к параллелизму ЦП, но и к асинхронности: замедление такие операции, как работа с базой данных или чтение по сети, в то время как программа выполняет другую работу, как это обычно происходит на серверах, основанных на событиях [65]
Первичная конструкция параллелизма - это goroutine, тип легковесного процесса. Вызов функции с префиксом Ключевое слово go запускает функцию в новой goroutine. Спецификация языка не определяет, как должны быть реализованы goroutines, но текущие реализации мультиплексируют goroutines процесса Go в меньший набор потоков операционной системы, аналогично планированию, выполненному в Erlang [66]: 10
Несмотря на то, что доступен стандартный пакет библиотеки, включающий большинство классических структур управления параллелизмом, блокировки мьютекса и т. Д., [66]: 151–152 идиоматические параллельные программы вместо этого предпочитают каналы, которые обеспечивают отправку сообщений между программами [67]. сообщения в порядке FIFO [51]: 43 и позволяют отправлять выполнение подпрограмм до получения их сообщений. Каналы набираются так, что канал типа chan T может использоваться только для передачи сообщения типа T Специальный синтаксис используется для работы с ними; & lt; -ch - это выражение, которое заставляет выполняющуюся процедуру блокироваться до тех пор, пока значение не поступит по каналу ch, в то время как ch & lt; - x отправляет значение x, возможно, блокирующееся, пока другая программа не получит значение. Встроенный переключатель типа select оператор может использоваться для реализации неблокирующей связи по нескольким каналам; см. ниже пример Go имеет модель памяти, описывающую, как программы должны использовать каналы или другие операции для безопасного обмена данными. Существование наборов каналов. Помимо отдельных параллельных языков в стиле модели актора, таких как Erlang, где сообщения адресованы непосредственно акторам. соответствующие горутинам; стиль актера можно смоделировать в Go, поддерживая взаимно-однозначное соответствие между подпрограммами и каналами, но язык позволяет нескольким подпрограммам совместно использовать канал или одну подпрограмму для отправки и получения по нескольким каналам [66]: 147 < С помощью этих инструментов можно создавать параллельные конструкции, такие как рабочие пулы, конвейеры, в которых, скажем, файл распаковывается и анализируется при загрузке, фоновые вызовы с таймаутом, параллельные вызовы с набором служб и другие операции. [68] Каналы также нашли применение вдали от обычного понятия межпроцессного взаимодействия, например, выступают в качестве списка безопасных для параллелизма переработанных буферов, [69] реализуют сопрограммы, которые помогли создать имя goroutine, [70] и реализуют итераторы [71].
Связанные с параллелизмом структурные соглашения каналов Go и альтернативных входных каналов получены из модели последовательных процессов связи Тони Хоара. В отличие от предыдущих языков параллельного программирования, таких как Occam или Limbo, язык на w hich Со-дизайнер Роб Пайк (Rob Pike) работал, [72] Go не предоставляет никакого встроенного понятия безопасного или проверяемого параллелизма [73]. Хотя модель Go-процессов предпочтительна в Go, она не единственная: все функции в программа разделяет одно адресное пространство. Это означает, что изменяемые объекты и указатели могут быть общими для программ; см. § Отсутствие безопасности в условиях гонки, ниже. Пригодность для параллельного программирования.
Хотя функции параллелизма Go не предназначены главным образом для параллельной обработки, [65] они могут использоваться для программирования многопроцессорных машин с общей памятью. Были проведены различные исследования. Эффективность этого подхода [74] В одном из этих исследований сравнивались размеры строк кода и скорость программ, написанных опытным программистом, не знакомым с языком, и исправления этих программ экспертом Go из команды разработчиков Google. то же самое для Chapel, Cilk и Intel TBB. Исследование показало, что неспециалисты, как правило, писали алгоритмы «разделяй и властвуй» с одним оператором go на рекурсию, в то время как эксперт писал программы «распредели-работай-синхронизируй», используя по одной программе на процессор. программы, как правило, были быстрее, но и дольше [75]
Отсутствие безопасности в условиях гонки. Нет никаких ограничений на то, как горутины получают доступ к общим данным, что делает возможными условия гонки. как правило, если только программа не выполняет явную синхронизацию по каналам или иным способом, записи из одной процедуры могут быть частично, полностью или вообще не видны другой, часто без каких-либо гарантий относительно порядка записи [73]. Кроме того, внутренние структуры данных Go, такие как интерфейс значения, заголовки слайсов, хеш-таблицы и строковые заголовки не защищены от состояния гонки, поэтому безопасность типов и памяти может быть нарушена в многопоточных программах, которые изменяют общие экземпляры этих типов без синхронизации [76] [77]
Вместо языка поддержка, безопасное параллельное программирование, таким образом, опирается на соглашения; например, Чисналл рекомендует идиому, называемую «aliases xor mutable», что означает, что передача изменяемого значения или указателя по каналу сигнализирует о передаче владения этим значением его получателю [66]: 155
Omissions
Go преднамеренно пропускает некоторые функции, распространенные в других языках, включая наследование реализации, обобщенное программирование, утверждения, арифметику указателей и неявные преобразования типов. Из этих особенностей языка авторы Go выражают открытость к обобщенному программированию, явно выступают против утверждений и арифметики указателей, отстаивая выбор пропустить наследование типов как более полезный язык, вместо этого поощряя использование интерфейсов для достижения динамической диспетчеризации [b] и составления для повторного использования кода, составление и делегирование фактически в значительной степени автоматизируются путем встраивания структуры; По словам исследователей Шмагера и др., эта особенность «имеет много недостатков наследования: она влияет на открытый интерфейс объектов, она не является мелкозернистой, т. е. нет контроля уровня метода над внедрением, методы встроенных объектов не могут быть скрыты, и это статично », что делает« неочевидным »то, не будут ли программисты злоупотреблять им в той степени, в которой программисты на других языках имеют репутацию чрезмерно наследующего [50]. Что касается универсального программирования, некоторые встроенные функции фактически являются типами - общий, но они рассматриваются как особые случаи; Роб Пайк называет это слабостью языка, который в какой-то момент может быть изменен [43] Команда Google, которая разрабатывает язык, построила по крайней мере один компилятор для экспериментального диалекта Go с обобщениями, но не выпустила его [78]
После первоначального исключения исключений в язык был добавлен механизм исключения, похожий на панику / восстановление, который авторы Go рекомендуют использовать для устранения неисправимых ошибок, таких как те, которые должны остановить весь запрос программы или сервера, или в качестве ярлыка для распространения ошибок вверх. стек внутри пакета, но не через границы пакета; здесь возвращаются ошибки - стандартный API [79] [80] [81] [82]
Условные обозначения и стиль кода
Авторы Go прилагают значительные усилия для формирования стиля и дизайна программ Go:
Отступ , пробелы и другие детали кода на уровне поверхности автоматически стандартизируются с помощью инструмента gofmt. golint выполняет дополнительные проверки стиля автоматически. Инструменты и библиотеки, поставляемые с Go, предлагают стандартные подходы к таким вещам, как документация API godoc [83], тестирование go test, build go build, управление пакетами go get и т. д.
Go применяет правила, которые являются рекомендациями на других языках, например запрещение циклических зависимостей, неиспользуемых переменных или импортов и неявных преобразований типов
Пропуск некоторых функций, например функциональные ярлыки программирования, такие как map и C ++ - блоки try / finally в стиле, как правило, поощряют определенный явный, конкретный и императивный стиль программирования. В первый день команда Go опубликовала коллекцию идиом Go, а позже также собрала код r комментарии, доклады, официальные сообщения в блоге для обучения стилю и философии кодирования Go
Языковые инструменты
Go включает в себя те же инструменты отладки, тестирования и проверки кода, что и многие языковые дистрибутивы В дистрибутив Go входят, помимо других инструментов ,
go build, которая собирает двоичные файлы Go с использованием только информации в самих исходных файлах, без отдельных make-файлов - go test, для модульного тестирования и микробенчмарков - go fmt, для форматирования кода - go get, для извлечение и установка удаленных пакетов - go vet, статический анализатор, который ищет потенциальные ошибки в коде - go run, ярлык для создания и выполнения кода
godoc, для отображения документации или ее обслуживания через HTTP
gorename для переименования переменных, функций и т. д. безопасным для типов способом
генерировать - стандартный способ вызова генераторов кода - также включает поддержку профилирования и отладки, инструментарий времени выполнения, например, для отслеживания сбора мусора паузы и тестер состояния гонки сторонние инструменты, которые добавляют к стандартному дистрибутиву, такие как gocode, который позволяет автозаполнение кода во многих текстовых редакторах, goimports членом команды Go, который автоматически добавляет / удаляет импорт пакетов по мере необходимости, errcheck, который обнаруживает код, который может непреднамеренно игнорируйте ошибки, и существует больше плагинов для добавления поддержки языков в широко используемых текстовых редакторах, и по крайней мере одна IDE, LiteIDE, маркируется как «простая, кроссплатформенная Go IDE с открытым исходным кодом» [84]
Примеры
Hello world - вот программа Hello world на Go: пакет main
импорт "fmt"
func main
Пример параллелизма
Следующая простая программа демонстрирует возможности параллелизма Go для реализовать асинхронную программу. Он запускает два облегченных потока «goroutines»: один ожидает, пока пользователь наберет какой-то текст, а другой реализует тайм-аут. Оператор select ожидает, пока какая-либо из этих подпрограмм отправит сообщение в основную подпрограмму, и действует на пример первого сообщения, полученного из Chisnall [66]: 152




"fmt"
"time"
func readwordch chan string
func timeoutt chan bool
func main
Проекты Использование Go
В этом разделе слишком много ссылок на первоисточники. Усовершенствуйте этот раздел, добавив вторичные или третичные источники Ноябрь 2015 г. Узнайте, как и когда удалять это шаблонное сообщение. Некоторые известные приложения с открытым исходным кодом в Go включают в себя:
Docker, набор инструментов для развертывания контейнеров Linux
Doozer, сервис блокировки от поставщика управляемого хостинга Heroku [14]
geth Ethereum, вычислительная платформа общего мира
InfluxDB, база данных с открытым исходным кодом специально для обработка данных временных рядов с высокой доступностью и высокими требованиями к производительности
Juju, инструмент организации сервисов от Canonical, упаковщики Ubuntu Linux
Packer, инструмент для создания идентичных образов машин для нескольких платформ из одной исходной конфигурации
Snappy, менеджер пакетов для телефона Ubuntu, разработанный Canonical
Syncthi ng, клиент-серверное приложение для синхронизации файлов с открытым исходным кодом. Некоторые известные среды с открытым исходным кодом, использующие Go:
Beego, высокопроизводительная веб-инфраструктура на Go, используемая для веб-приложений и серверных служб [требуется цитата]
Martini, пакет для веб-приложений / сервисов [требуется цитата]
Gorilla, веб-инструментарий для Go [требуется цитата]
Enduro / X ASG, промежуточное ПО кластера, сервер приложений, распределенные транзакции и инфраструктура многопроцессорной обработки для Go [необходима цитата]
Другие известные компании и сайты, использующие Go в целом вместе с другими языками, не исключая, в частности: [85] [самостоятельно опубликованный источник] [86]
AeroFS, поставщик устройств для работы с частными облаками для синхронизации файлов, который перенес некоторые микросервисы от Java до Go с существенными улучшениями в области памяти [87]
Chango, компания, специализирующаяся на программной рекламе, использует Go в своих системах ставок в режиме реального времени [88] - Cloud Foundry, платформа как услуга [необходимо цитирование]
CloudFlare, для их прокси-сервера Railgun с дельта-кодированием, их распределенной службы DNS, а также инструменты для криптографии, ведения журналов, потоковой обработки и доступа к сайтам SPDY [89] [90] - CoreOS, операционная система на основе Linux, использующая контейнеры Docker [91] - Couchbase, Query и Indexing services в рамках Сервер Couchbase [92]
Dropbox перенес некоторые из своих критических компонентов с Python на Go [93]
Google, для многих проектов, в частности, включая сервер загрузки dlgooglecom [94] [95] [96]
MercadoLibre, для нескольких общедоступных API [необходима цитата]
MongoDB, инструменты для администрирования экземпляров MongoDB [97]
Netflix, для двух частей их серверной архитектуры [98]
Novartis, для внутренней системы инвентаризации [цитата необходимо]
Plugdj, интерактивный веб-сайт для потоковой передачи музыки в социальных сетях [99]
Реплицированный PaaS на основе Docker для создания корпоративного устанавливаемого программного обеспечения [100]
SendGrid, доставка и управление транзакционной электронной почтой на основе Boulder, Колорадо. сервис [101]
SoundCloud, для «десятков систем» [102]
Splice, для всего бэкэнда API и парсеров th eir онлайновая музыкальная платформа для совместной работы [103]
ThoughtWorks, некоторые инструменты и приложения для непрерывной доставки и мгновенных сообщений CoyIM [104]
Twitchtv, для своей системы чата на основе IRC, перенесенной с Python [105]
Uber, для обработки больших объемов запросов на основе геозоны [106]
Zerodha, для пиринга в реальном времени и потоковой передачи рыночных данных [цитата необходима]
Прием
Первый выпуск Go вызвал много дискуссий
Система интерфейса, и преднамеренное упущение наследования, были высоко оценены Микеле Симионато, который сравнил эти языковые характеристики со стандартными ML, назвав это «позором, что ни один популярный язык не следовал [этому] определенному маршруту в пространстве дизайна» [107] > Дейв Астелс из Engine Yard писал: [108]
В Go очень легко углубиться. Существует минимальное количество фундаментальных языковых концепций, а синтаксис понятен и разработан, чтобы быть ясным и однозначным. Go все еще экспериментален и еще немного шероховатый по краям

Ars Technica Роб Роб Пайк, один из авторов Go, спросил, зачем нужен новый язык. Он ответил, что: [109]
Недостаточно просто добавить функции в существующие языки программирования, потому что иногда можно получить больше информации. в долгосрочной перспективе, забирая вещи. Они хотели начать с нуля и переосмыслить все [но они не хотели] слишком сильно отклоняться от того, что разработчики уже знали, потому что они хотели избежать отчуждения целевой аудитории Go - Go был назван Язык программирования Год по индексу TIOBE Programming Community за первый год, 2009 год, за 12-месячное увеличение популярности всего за 2 месяца после его введения в ноябре, по сравнению с любым другим языком в этом году, и к 13 января достиг 13-го места, [110] превосходя общепринятые языки, такие как Паскаль. К июню 2015 года его рейтинг упал до уровня ниже 50-го в индексе, став его ниже, чем COBOL и Fortran [111]. Но по состоянию на сентябрь 2016 года [обновление] его рейтинг вырос до 19-го, что указывает на значительный рост По популярности и принятию [112]
Что касается Go, Брюс Экель заявил: [113]
Сложность C ++ еще больше сложности была добавлена в новый C ++, и получающееся влияние на производительность, больше не оправдано Все трудности, через которые программист C ++ должен был прыгнуть, чтобы использовать C-совместимый язык, больше не имеют смысла - это просто пустая трата времени и усилий. Go имеет гораздо больше смысла для класса задач, который изначально был в C ++. предназначен для решения
Оценка языка и его реализации в 2011 году по сравнению с C ++ GCC, Java и Scala инженером Google обнаружила, что:
Go предлагает интересные языковые функции, которые также допускают краткую и стандартизированную запись Компиляторы для этого языка все еще незрелые, что отражается как на производительности, так и на размерах двоичных файлов. - R Hundt [114]
Оценка получила опровержение от команды разработчиков Go Иана Лэнса Тейлора, который улучшил код Go для Бумага Хундта, не знала о намерении Ион публикует свой код и говорит, что его версия «никогда не предназначалась для того, чтобы быть примером идиоматического или эффективного Go»; Затем Расс Кокс оптимизировал код Go, а также код C ++ и заставил код Go работать немного быстрее, чем C ++, и более чем на порядок быстрее, чем «оптимизированный» код в статье [115]
Спор об именах
10 ноября 2009 года, в день общего релиза языка, Фрэнсис МакКейб, разработчик Go! язык программирования, обратите внимание на восклицательный знак, попросил изменить название языка Google, чтобы избежать путаницы с его языком, который он потратил 10 лет на разработку [116]. МакКейб выразил обеспокоенность тем, что «большой парень» обернется над ним ». и эта озабоченность нашла отклик у более чем 120 разработчиков, которые прокомментировали официальную ветку проблем Google, заявив, что они должны изменить имя, при этом некоторые [117] даже заявили, что проблема противоречит девизу Google: «Не будь злым» [118]. закрыто разработчиком Google 12 октября 2010 года с пользовательским статусом «Прискорбно» и со следующим комментарием: «Есть много компьютерных продуктов и услуг под названием Go. За 11 месяцев, прошедших с момента нашего выпуска, между этими двумя языками была минимальная путаница»
Смотрите также
Портал бесплатных программ
Сравнение языков программирования
Dart, еще один язык программирования Google
UFCS, способ использования «открытых методов» на других языках
Заметки
^ Обычно, точно один из результатов и значения ошибки имеют значение, отличное от нулевого значения типа; иногда и то и другое, как, например, когда чтение или запись могут быть завершены только частично, а иногда и нет, например, когда чтение возвращает 0 байтов. См. проблему с полуредикатом: многозначное возвращение
^ Вопросы «Как получить динамическую диспетчеризацию методов» и « Почему нет наследования типов »в FAQ по языку [10]
Ссылки
Эта статья содержит материал из официального учебника Go, который распространяется по лицензии Creative Commons Attribution 30

« FAQ - The Go Язык программирования «Golangorg Retrieved» 2013-06-25
^ «История выпусков - язык программирования Go» Golangorg Retrieved 19 октября 2016 г.
^ ab «Почему у Go нет« реализует »декларации» Golangorg Retrieved 1 октября 2015 г.
^ Пайк, Роб 2014-12-22 «Роб Пайк в Твиттере» Получено 2016-03-13 Go использует структурную типизацию, а не типизацию по типу утки Полное удовлетворение интерфейса проверяется и требуется
^ "lang / go: go- 14 – Go programming language" OpenBSD ports 2014-12-23 Retrieved 2015-01-19 
^ "Go Porting Efforts" G o Language Resources cat-v 12 January 2010 Retrieved 18 January 2010 
^ "Text file LICENSE" The Go Programming Language Google Retrieved 5 October 2012 
^ "Additional IP Rights Grant" The Go Programming Language Google Retrieved 5 October 2012 
^ a b Pike, Rob 2014-04-24 "Hello Gophers" Retrieved 2016-03-11 
^ a b c "Language Design FAQ" golangorg 16 January 2010 Retrieved 27 February 2010 
^ "The Evolution of Go" Retrieved 2015-09-26 
^ https://golangorg/LICENSE
^ Kincaid, Jason 10 November 2009 "Google's Go: A New Programming Language That's Python Meets C++" TechCrunch Retrieved 18 January 2010 
^ a b Metz, Cade 5 May 2011 "Google Go boldly goes where no code has gone before" The Register 
^ "Go FAQ: Is Google using Go internally" Retrieved 9 March 2013 
^ "Google's In-House Programming Language Now Runs on Phones" wiredcom 19 August 2015 
^ "FAQ: Implementation" golangorg 16 January 2010 Retrieved 18 January 2010 
^ "Installing GCC: Co nfiguration" Retrieved 3 December 2011 Ada, Go and Objective-C++ are not default languages 
^ "Go 15 Release Notes" Retrieved 28 January 2016 The compiler and runtime are now implemented in Go and assembler, without C 
^ Pike, Rob 28 April 2010 "Another Go at Language Design" Stanford EE Computer Systems Colloquium Stanford University  Video available
^ "Frequently Asked Questions FAQ - The Go Programming Language" golangorg Retrieved 2016-02-26 
^ Andrew Binstock 18 May 2011 "Dr Dobb's: Interview with Ken Thompson" Retrieved 7 February 2014 
^ Pike, Rob 2012 "Less is exponentially more" 
^ Robert Griesemer 2015 "The Evolution of Go" 
^ "Release History" 
^ https://golangorg/doc/go17
^ Pike, Rob "The Go Programming Language" YouTube Retrieved 1 Jul 2011 
^ Rob Pike 10 November 2009 The Go Programming Language flv Tech talk Google Event occurs at 8:53 
^ Download and install packages and dependencies - go - The Go Programming Language; see godocorg for addresses and documentation of some packages
^ "GoDoc" godocorg 
^ Rob Pike, on The Changelog podcast
^ a b c Will Yager, Why Go is not Good
^ Egon Elbre, Summary of Go Generics discussions
^ Fitzpatrick, Brad "Go: 90% Perfect, 100% of the time" Retrieved 28 January 2016 
^ Danny Gratzer, Leaving Go
^ a b Jared Forsyth, Rust vs Go
^ Janos Dobronszki, Everyday Hassles in Go
^ Rob Pike, Less is exponentially more
^ The Go Authors, Frequently Asked Questions FAQ
^ Rob Pike, Generating code
^ Richard Hudson, Go 14+ Garbage Collection GC Plan and Roadmap
^ Rob Pike, Strings, bytes, runes and characters in Go, 23 October 2013
^ a b Pike, Rob 26 September 2013 "Arrays, slices and strings: The mechanics of 'append'" The Go Blog Retrieved 7 March 2015 
^ Andrew Gerrand, Go Slices: usage and internals
^ The Go Authors, Effective Go: Slices
^ The Go authors Selectors - The Go Programming Language Specification and Calls - The Go Programming Language Specification
^ "The Go Programming Language Specification" golangorg 
^ "The Go Programming Language Specification" golangorg 
^ "The Go Programming Language Specification" golangorg 
^ a b Schmager, Frank; Cameron, Nicholas; Noble, James 2010 GoHotDraw: evaluating the Go programming language with design patterns Evaluation and Usability of Programming Languages and Tools ACM 
^ a b Summerfield, Mark 2012 Programming in Go: Creating Applications for the 21st Century Addison-Wesley 
^ a b c d e Balbaert, Ivo 2012 The Way to Go: A Thorough Introduction to the Go Programming Language iUniverse 
^ "The Evolution of Go" talksgolangorg Retrieved 2016-03-13 
^ Diggins, Christopher 2009-11-24 "Duck Typing and the Go Programming Language" Dr Dobb's Retrieved 2016-03-10 
^ Ryer, Mat 2015-12-01 "Duck typing in Go" Retrieved 2016-03-10 
^ "The Go Programming Language Specification" golangorg 
^ "The Go Programming Language Specification" golangorg 
^ reflectValueOfi interface converts an interface to a reflectValue that can be further inspected
^ "Go Data Structures: Interfaces" Retrieved 15 November 2012 
^ "The Go Programming Language Specification" golangorg 
^ "A Tutorial for the Go Programming Language" The Go Programming Language Google Retrieved 10 March 2013 In Go the rule about visibility of information is simple: if a name of a top-level type, function, method, constant or variable, or of a structure field or method is capitalized, users of the package may see it Otherwise, the name and hence the thing being named is visible only inside the package in which it is declared 
^ "go - The Go Programming Language" golangorg 
^ "How to Write Go Code" golangorg The packages from the standard library are given short import paths such as "fmt" and "net/http" For your own packages, you must choose a base path that is unlikely to collide with future additions to the standard library or other external libraries If you keep your code in a source repository somewhere, then you should use the root of that source repository as your base path For instance, if you have a GitHub account at githubcom/user, that should be your base path 
^ "Go Packaging Pr oposal Process" 
^ a b Rob Pike, Concurrency is not Parallelism
^ a b c d e Chisnall, David 2012 The Go Programming Language Phrasebook Addison-Wesley 
^ "Effective Go" golangorg 
^ "Go Concurrency Patterns" golangorg 
^ John Graham-Cumming, Recycling Memory Buffers in Go
^ treego
^ Ewen Cheslack-Postava, Iterators in Go
^ Brian W Kernighan, A Descent Into Limbo
^ a b "The Go Memory Model" Google Retrieved 5 January 2011 
^ Tang, Peiyi 2010 Multi-core parallel programming in Go PDF Proc First International Conference on Advanced Computing and Communications 
^ Nanz, Sebastian; West, Scott; Soares Da Silveira, Kaue Examining the expert gap in parallel programming PDF Euro-Par 2013 CiteSeerX 10113686137 
^ Russ Cox, Off to the Races
^ Rob Pike October 25, 2012 "Go at Google: Language Design in the Service of Software Engineering" Google, Inc  "There is one important caveat: Go is not purely memory safe in the presence of concurrency"
^ "E2E: Erik Meijer and Robert Griesemer – Going Go" Channel 9 Microsoft 7 May 2012 
^ Panic And Recover, Go wiki
^ "Weekly Snapshot History" golangorg 
^ "Proposal for an exception-like mechanism" golang-nuts 25 March 2010 Retrieved 25 March 2010 
^ "Effective Go" golangorg 
^ "Effective Go" golangorg 
^ LiteIDE,
^ Erik Unger, The Case For Go
^ Andrew Gerrand, Four years of Go, The Go Blog
^ Hugues Bruant "AeroFS - A little golang way" AeroFS 
^ "Chango" GitHub 
^ John Graham-Cumming, Go at CloudFlare
^ John Graham-Cumming, What we've been doing with Go
^ "Go at CoreOS" 
^ "Couch base" GitHub 
^ Patrick Lee, Open Sourcing Our Go Libraries, 7 July 2014
^ "dlgooglecom: Powered by Go" golangorg 
^ Matt Welsh, Rewriting a Large Production System in Go
^ David Symonds, High Performance Apps on Google App Engine
^ "Mongo DB" GitHub 
^ "The Netflix Tech Blog: Application data caching using SSDs" 
^ Steven Sacks "Search &amp; Advances" plugdj tech blog 
^ "ReplicatedHQ" GitHub 
^ Tim Jenkins "How to Convince Your Company to Go With Golang" SendGrid's Email Deliverability Blog 
^ Peter Bourgon, Go at SoundCloud
^ "Go at Google I/O and Gopher SummerFest - The Go Blog" golangorg 
^ TWSTRIKE "CoyIM" ThoughtWorks STRIKE team 
^ Rhys Hiltner, Go’s march to low-latency GC, 5 July 2016
^ "How We Built Uber Engineering's Highest Query per Second Service Using Go" Uber Engineering Blog Retrieved 2016-03-02 
^ Simionato, Michele 15 November 2009 "Interfaces vs Inheritance or, watch out for Go!" artima Retrieved 15 November 2009 
^ Astels, Dave 9 November 2009 "Ready, Set, Go!" engineyard Retrieved 9 November 2009 
^ Paul, Ryan 10 November 2009 "Go: new open source programming language from Google" Ars Technica Retrieved 13 November 2009 
^ jt "Google's Go Wins Programming Language Of The Year Award" jaxenter Retrieved 5 December 2012 
^ "TIOBE Programming Community Index for June 2015" TIOBE Software June 2015 Retrieved 5 July 2015 
^ "TIOBE Programming Community Index for September 2016" TIOBE Software September 2016 Retrieved 17 September 2016 
^ Bruce Eckel 27 August 2011 "Calling Go from Python via JSON-RPC" Retrieved 29 August 2011 
^ Hundt, Robert 2011 Loop recognition in C++/Java/Go/Scala PDF Scala Days 
^ Metz, Cade 1 July 2011 "Google Go strikes back with C++ bake-off" The Register 
^ Brownlee, John 13 November 2009 "Google didn't google "Go" before naming their programming language'" 
^ Claburn, Thomas 11 November 2009 "Google 'Go' Name Brings Accusations Of Evil'" InformationWeek Retrieved 18 January 2010 
^ "Issue 9 - go — I have already used the name for MY programming language" Google Code Google Inc Retrieved 12 October 2010 
External links
Wikimedia Commons has media related to Go programming language
Official website
A Tour of Go official
Go Programming Language Resources unofficial
Co mmunity and conferences
Gopher Academy, Gopher Academy is a group of developers working to educate and promote the Go community
Golangprojectscom, lists programming jobs and projects where companies are looking for people that know Go
GopherCon The first Go conference Denver, Colorado, USA April
Gopher Gala The first Go hackathon
GopherConIndia The first Go conference in India Bangalore Feb
GolangUK The first Go conference in UK London
dotGo European conference Paris, France
GolangShow Go audio podcast GolangShow
Golang Argentina Gophers community blog in Argentina
v
e
Programming languages
Comparison
Timeline
History
Assembly
BASIC
C
C++
C#
COBOL
Fortran
Go
Haskell
Java
JavaScript JS
Lisp
Lua
Objective-C
Pascal
Perl
PHP
Python
Ruby
Shell
Smalltalk
Swift
Visual Basic NET VBNET
more
Category
Comparison
Lists
Alphabetical
Categorical
Generational
No n-English-based
v
e
Google
Overview
Alphabet Inc
History
List of mergers and acquisitions
Products
Criticism
Privacy concerns
Censorship
Domains
Easter eggs
Don't be evil
Advertising
AdMob
Adscape
AdSense
AdWords
Analytics
Contributor
Partners
DoubleClick
DoubleClick for Publishers
Wallet
Communication
Allo
Alerts
Apps Script
Duo
Calendar
Contacts
Gmail
history
interface
Google+
Groups
Hangouts
Inbox
Sync
Text-to-Speech
Translate
Transliteration
Voice
Software
Assistant
Chrome
for Android
for iOS
Chrome Web Store
Apps
Extensions
Cloud Print
Earth
Sky
Moon
Mars
Gadgets
Gboard
Goggles
IME
Pinyin
Japanese
Photos
Keep
News &amp; Погода
сейчас
OpenRefine
Поиск
Панель инструментов
Платформы
Аккаунт
Android
история версий
разработка программного обеспечения
Android Auto
Android Pay
Android TV - Android Wear - Аутентификатор
Кузов
Книги
Библиотечный проект
Caja
Картон
Литая
Chromecast
Chrome OS
Chromebit
Chromebook
Chromebox
Chrome Zone
Облачная платформа
Платформа приложений
BigQuery
BigTable
Вычислительный движок
Хранение
Контактные линзы
Пользовательские Поиск
Дартс
Мечты о Земле Двигатель
Fit
GFS
Стекло
Go
G Suite
Классная комната
Домой
Jamboard
Торговая площадка
Собственный клиент
Nexus
OnHub
OpenSocial
Pixel
Play
Книги
Игры
Фильмы и видео; ТВ, музыка, газетный киоск, общедоступный DNS, кошелек, Wifi, инструменты для разработки, API-интерфейсы AJAX, приложение Inventor, средства закрытия, разработчики
GData
Googlebot
Guava
Guice
GWS
KML
Kythe
MapReduce
Mediabot
Sitemap - Лето кода - Web Toolkit Консоль поиска - Оптимизатор веб-сайта
Swiffy - Публикация
Blogger
Закладки - Привод - Документы, листы, слайды, формы - Чертежи
Мои карты
Fusion Tables - Домены
FeedBurner
Map Maker - Panoramio - Сайты - YouTube - YouTube Instant - YouTube Red - Vevo
Zagat
Поиск по шкале времени - Appliance
Поиск по блогам
Книги
Ngram Viewer
Пользовательский поиск
Финансы
Полеты
Изображения
Карты
Марс
> Луна, небо, небо, вид на улицу, покрытие, конкуренция, вопросы конфиденциальности, новости, архив, патенты, общедоступные данные, ученый, шоппинг. br> Usenet
Видео
Алгоритмы
PageRank
Panda
Пингвин
Колибри - Возможности - История веб-поиска - Персонализированные - В реальном времени - Мгновенно высушивать ch
SafeSearch - Голосовой поиск - Анализ - Статистика для поиска - Тенденции - График знаний - Хранилище знаний - Прекращено - Aardvark - Ответы
Браузер Синхронизация
База
Buzz
Оформление заказа - Хромированная рамка - Click-to-Call - Cloud Connect - Поиск кода - Потоки
Рабочий стол
Словарь
Dodgeball - Fast Flip - Friend Connect - Gears - GOOG-411 - Google TV, Jaiku, Knol, Здоровье, iGoogle
Image Labeler - Лаборатории - Широта - Lively - Mashup Editor - Блокнот - Предложения - Orkut - Пакет обновлений - Создатель страниц - Picasa - Веб-альбомы Picasa
Picnik
PowerMeter
Q & amp; A
Reader, Script Converter, SearchWiki, Sidewiki, Слайд, Квадрат, Обсуждение, Обновление, Urchin, Видео, Wave, Web. Ускоритель
Люди
Аль Гор - Алан Юстас, Алан Мулалли, Амит Сингхол, Энн Мазер, Дэвид Драммонд, Эрик Шмидт, Джефф Дин, Джон Доерр
Джон Л Хеннесси, Кришна Бхарат, Мэтт Каттс, Патрик Пичетт, Пол Отеллини, Омид Кордестани, Рэйчел Уитстон, Раджен Шет, Рам Шрирам, Рэй Курцвейл
Рут Порат
Салар Камангар
Ширли М Тилгман
Сундар Пичай
Сьюзан Войчицки
Урс Хёльцле
Винт Серф
Учредители
Ларри Пейдж
Сергей Brin - Прочее
Арт-проект
Calico
Актуальные
Chrome Experifts
Code-in
Code Jam - День разработчика - Бизнес-группы Google - Сделано с Код
Освобождение данных - Takeout - Google Developer Expert - Google для работы - Автомобиль без водителя - Earth Outreach - Fiber - GV - Google Китай - Google Express
Googlization
Гранты
Googleorg
Лунный X Приз - Проект Fi
Material Design
Motorola Mobility
WiFi
X
Events
Science Fair
Searchology
I/O
Developer Day
AtGoogleTalks
Code Jam
Highly Open Participation Contest
Code-in
Projects
Ara
Loon
Tango
Sunroof
Real estate
111 Eighth Avenue
Googleplex
Logo
Doodle4Google
Google Doodles
Related
AI Challenge
Bomb
Goojje
Monopoly City Streets
Unity
Category
Portal
v
e
Rob Pike
Operating systems
Plan 9 from Bell Labs
Inferno
Programming languages
Newsqueak
Limbo
Go
Sawzall
Software
acme
Blit
sam
rio

Publications
The Practice of Programming
The Unix Programming Environment
Other
Renée French
Mark V Shaney
UTF-8
v
e
Ken Thompson
Operating systems
Unix
Plan 9 from Bell Labs
Programming languages
B
Bon
Go
Software
Belle
ed
grep
sam
Space Travel
Thompson shell
Other
UTF-8


Go (programming language)

Random Posts

Picts

Picts

The Picts were a tribal confederation of peoples who lived in what is today eastern and northern Sco...
Visual prosthesis

Visual prosthesis

A visual prosthesis, often referred to as a bionic eye, is an experimental visual device intended to...
Mini rugby

Mini rugby

Mini rugby, also known as New Image Rugby, is a form of rugby union designed to introduce the sport ...
List of synthetic polymers

List of synthetic polymers

Synthetic polymers are human-made polymers From the utility point of view they can be classified int...