Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Go представляет собой статический типизированный , составленный язык программирования разработан на Google [14] на Роберт Грисемера , Роб Пайк и Кен Томпсон . [12] Го синтаксически похож на C , но с безопасностью памяти , сборки мусора , структурного ввода , [6] и СКП -style параллельности . [15] Этот язык часто называют Голанг из-за его доменного имени,golang.org, но собственное имя - Go. [16]

Есть две основные реализации:

  • Инструментарий компилятора Google для самостоятельного размещения [17], ориентированный на несколько операционных систем , и WebAssembly . [18]
  • gccgo, интерфейс GCC . [19] [20]

Сторонний транспилятор GopherJS [21] компилирует Go to JavaScript для интерфейсной веб-разработки .

История [ править ]

Go был разработан в Google в 2007 году для улучшения программирования производительности в эпоху многоядерных процессоров , сетевых машин и больших базы кода . [22] Разработчики хотели отреагировать на критику других языков, используемых в Google , но сохранить их полезные характеристики: [23]

  • статическая типизация и эффективность во время выполнения (например, C ),
  • удобочитаемость и удобство использования (например, Python или JavaScript ), [24]
  • высокопроизводительные сети и многопроцессорность .

Дизайнеры в первую очередь руководствовались общей неприязнью к C ++ . [25] [26] [27]

Go был публично анонсирован в ноябре 2009 года [28], а версия 1.0 была выпущена в марте 2012 года. [29] [30] Go широко используется в производственной среде в Google [31] и во многих других организациях и проектах с открытым исходным кодом.

Талисман суслика

В ноябре 2016 года шрифты Go и Go Mono были выпущены шрифтовыми дизайнерами Чарльзом Бигелоу и Крисом Холмсом специально для использования в проекте Go. Go - это гуманистический шрифт без засечек, напоминающий Lucida Grande, а Go Mono - моноширинный . Каждый из шрифтов соответствует набору символов WGL4 и был разработан так, чтобы быть разборчивым, с большой высотой по оси x и отличными формами букв. И Go, и Go Mono соответствуют стандарту DIN 1450, поскольку в них есть ноль с косой чертой, нижний регистр lс хвостиком и верхний регистр Iс засечками. [32] [33]

В апреле 2018 года оригинальный логотип был заменен на стилизованный наклонный вправо стилизованный GO с замыкающими линиями обтекаемости. Однако талисман суслика остался прежним. [34]

В августе 2018 года основные участники Go опубликовали два «черновика» новых языковых функций, универсальных шаблонов и обработки ошибок и попросили пользователей Go оставить отзыв о них. [35] [36] Отсутствие поддержки общего программирования и многословность обработки ошибок в Go 1.x вызвали серьезную критику .

История версий [ править ]

Go 1 гарантирует совместимость [37] спецификации языка и основных частей стандартной библиотеки. Все версии до текущего выпуска Go 1.15 [38] сохранили это обещание.

Каждый основной выпуск Go поддерживается до двух новых основных выпусков. [39]

Дизайн [ править ]

Go основан на C , но с упором на большую простоту и безопасность. Язык состоит из:

  • Синтаксис и среда, в которой используются шаблоны, более распространенные в динамических языках : [45]
    • Необязательное краткое объявление и инициализация переменных посредством вывода типа ( x := 0вместо int x = 0;или var x = 0;).
    • Быстрая компиляция. [46]
    • Удаленное управление пакетами ( go get) [47] и интерактивная документация пакетов. [48]
  • Отличительные подходы к конкретным проблемам:
    • Встроенные примитивы параллелизма: облегченные процессы (горутины), каналы и selectоператор.
    • Система интерфейса вместо виртуального наследования и встраивание типов вместо невиртуального наследования.
    • Набор инструментов, который по умолчанию создает статически связанные собственные двоичные файлы без внешних зависимостей.
  • Желание сохранить спецификацию языка достаточно простой, чтобы держать ее в голове программиста [49], частично за счет исключения функций, которые являются общими для подобных языков .

Синтаксис [ править ]

Синтаксис Go включает изменения по сравнению с C, направленные на то, чтобы код оставался лаконичным и читаемым. Комбинированный оператор декларации / инициализация был введен , что позволяет программисту писать i := 3или s := "Hello, world!", без указания типов переменных , используемых. Это контрастирует с C int i = 3;и const char *s = "Hello, world!";. Точки с запятой по-прежнему завершают операторы [a], но неявно используются в конце строки. [b] Методы могут возвращать несколько значений, и возвращение result, errпары - это обычный способ, которым метод сообщает об ошибке вызывающей стороне в Go. [c] Go добавляет буквальные синтаксисы для инициализации параметров структуры по имени и для инициализации карт и фрагментов.. В качестве альтернативы forциклу из трех операторов C rangeвыражения Go позволяют выполнять краткую итерацию по массивам, срезам, строкам, картам и каналам. [52]

Типы [ править ]

Go имеет ряд встроенных типов, включая числовые ( byte , int64 , float32 и т. Д.), Логические и символьные строки ( string ). Строки неизменны; встроенные операторы и ключевые слова (а не функции) обеспечивают объединение, сравнение и кодирование / декодирование UTF-8 . [53] Типы записей можно определить с помощью ключевого слова struct . [54]

Для каждого типа T и каждой неотрицательной целочисленной константы n существует тип массива, обозначенный [ n ] T ; Таким образом, массивы разной длины относятся к разным типам. Динамические массивы доступны в виде «срезов», обозначаемый [] T для некоторого типа T . Они имеют длину и емкость, определяющие, когда необходимо выделить новую память для расширения массива. Несколько фрагментов могут совместно использовать свою базовую память. [55] [56] [57]

Указатели доступны для всех типов, а также указатель-to - T типа обозначаются * T . При приеме адреса и косвенном обращении используются операторы & и * , как в C, или неявно через вызов метода или синтаксис доступа к атрибуту. [58] Нет арифметики указателей, [d] кроме специального типа unsafe.Pointer в стандартной библиотеке. [59]

Для пары типов K , V карта типов [ K ] V является типом хэш-таблиц, отображающих ключи типа K в значения типа V. Хеш-таблицы встроены в язык со специальным синтаксисом и встроенными функциями. chan T - это канал, который позволяет отправлять значения типа T между параллельными процессами Go . [ необходима цитата ]

Помимо поддержки интерфейсов , система типов Go является номинальной : ключевое слово type может использоваться для определения нового именованного типа , который отличается от других именованных типов, имеющих такой же макет (в случае структуры те же члены в в том же порядке). Некоторые преобразования между типами (например, между различными целочисленными типами) предопределены, и добавление нового типа может определять дополнительные преобразования, но преобразования между именованными типами всегда должны вызываться явно. [60] Например, ключевое слово type можно использовать для определения типа адресов IPv4 на основе 32-битных целых чисел без знака:

введите  ipv4addr  uint32

С этим определением типа ipv4addr (x) интерпретирует значение x uint32 как IP-адрес. Простое присвоение x переменной типа ipv4addr является ошибкой типа. [ необходима цитата ]

Постоянные выражения могут быть типизированными или «нетипизированными»; им присваивается тип при назначении типизированной переменной, если значение, которое они представляют, проходит проверку во время компиляции. [61]

Типы функций обозначаются ключевым словом func ; они принимают ноль или более параметров и возвращают ноль или более значений, все из которых являются типизированными. Параметр и возвращаемые значения определяют тип функции; таким образом, func (string, int32) (int, error) - это тип функций, которые принимают строку и 32-разрядное целое число со знаком и возвращают целое число со знаком (ширины по умолчанию) и значение встроенного типа интерфейса. ошибка . [ необходима цитата ]

С любым именованным типом связан набор методов . Приведенный выше пример IP-адреса можно расширить с помощью метода проверки, является ли его значение известным стандартом:

// ZeroBroadcast сообщает, является ли адрес 255.255.255.255. FUNC  ( адр  ipv4addr )  ZeroBroadcast ()  BOOL  {  возвращение  адр  ==  0xFFFFFFFF }

Из-за номинальной типизации это определение метода добавляет метод к ipv4addr , но не к uint32 . Хотя методы имеют особое определение и синтаксис вызова, отдельного типа метода не существует. [62]

Система интерфейса [ править ]

Go предоставляет две функции, которые заменяют наследование классов . [ необходима цитата ]

Первый - это встраивание , которое можно рассматривать как автоматизированную форму композиции [63] или делегирования . [64] : 255

Во-вторых, это интерфейсы , обеспечивающие полиморфизм времени выполнения . [65] : 266 Интерфейсы - это класс типов, обеспечивающий ограниченную форму структурной типизации в системе Go с номинальными типами. Объект, который относится к типу интерфейса, также относится к другому типу, подобно объектам C ++, которые одновременно являются базовым и производным классами. Интерфейсы Go были разработаны на основе протоколов языка программирования Smalltalk. [66] Во многих источниках при описании интерфейсов Go используется термин « утиная печать» . [67] [68]Хотя термин «утиная типизация» точно не определен и, следовательно, не является неправильным, он обычно подразумевает, что соответствие типа не проверяется статически. Поскольку соответствие интерфейсу Go проверяется компилятором Go статически (кроме случаев, когда выполняется утверждение типа), авторы Go предпочитают термин структурная типизация . [69]

В определении типа интерфейса перечислены необходимые методы по имени и типу. Любой объект типа T, для которого существуют функции, соответствующие всем требуемым методам интерфейса типа I, также является объектом типа I. Определение типа T не обязательно (и не может) идентифицировать тип I. Например, если форма , квадрат и круг определены как

импорт  "математика"введите  интерфейс формы  { Area () float64 }   type  Square  struct  {  // Примечание: нет "реализует"  сторону  объявления float64 }func  ( sq  Square )  Area ()  float64  {  return  sq . сторона  *  кв . сторона  }type  Circle  struct  {  // Здесь нет объявления "реализует" или  radius  float64 }func  ( c  Circle )  Area ()  float64  {  return  math . Пи  *  математика . Pow ( c . Радиус ,  2 )  }

тогда как Square, так и Circle неявно являются Shape и могут быть присвоены переменной типа Shape . [65] : 263–268 В формальном языке интерфейсная система Go обеспечивает структурную, а не номинальную типизацию. Интерфейсы могут встраивать другие интерфейсы с эффектом создания комбинированного интерфейса, которому удовлетворяют именно те типы, которые реализуют встроенный интерфейс, и любые методы, которые добавляет новый определенный интерфейс. [65] : 270

Стандартная библиотека Go использует интерфейсы для обеспечения универсальности в нескольких местах, включая систему ввода / вывода, основанную на концепциях Reader и Writer . [65] : 282–283

Помимо вызова методов через интерфейсы, Go позволяет преобразовывать значения интерфейса в другие типы с проверкой типа во время выполнения. Языковые конструкции для этого являются утверждением типа , [70] , который проверяет против одного потенциального типа, а переключатель типа , [71] , который проверяет против нескольких типов. [ необходима цитата ]

Пустой интерфейс interface{} является важной базой случая , потому что он может обратиться к пункту любого типа бетона. Он похож на класс Object в Java или C # и подходит для любого типа, включая встроенные типы, такие как int . [65] : 284 Код, использующий пустой интерфейс, не может просто вызывать методы (или встроенные операторы) для указанного объекта, но он может сохранить значение, попытаться преобразовать его в более полезный тип с помощью утверждения типа или типа переключитесь или осмотрите его с помощью пакета Go . [72] Потому чтоinterface{}reflectinterface{}может ссылаться на любое значение, это ограниченный способ избежать ограничений статической типизации, как void*в C, но с дополнительными проверками типа во время выполнения. [ необходима цитата ]

interface{}Тип может быть использован для моделирования структурированных данных любой произвольной схемы в Go, такие как JSON или YAML данных, представляя его как map[string]interface{}(карта строки в пустой интерфейс). Это рекурсивно описывает данные в виде словаря со строковыми ключами и значениями любого типа. [73]

Значения интерфейса реализуются с использованием указателя на данные и второго указателя на информацию о типе времени выполнения. [74] Как и некоторые другие типы, реализованные с использованием указателей в Go, значения интерфейса не nilинициализированы. [75]

Система пакетов [ править ]

В системе пакетов Go каждый пакет имеет путь (например, "compress/bzip2"или "golang.org/x/net/html") и имя (например, bzip2или html). Ссылки на определения других пакетов всегда должны начинаться с префикса имени другого пакета, и доступны только имена с заглавной буквы из других пакетов: io.Readerявляется общедоступным, но bzip2.readerне является. [76] Команда go getможет извлекать пакеты, хранящиеся в удаленном репозитории [77], и разработчикам рекомендуется разрабатывать пакеты внутри базового пути, соответствующего исходному репозиторию (например, example.com/user_name/package_name), чтобы уменьшить вероятность конфликта имен. с будущими дополнениями к стандартной библиотеке или другим внешним библиотекам. [78]

Существуют предложения по внедрению надлежащего решения для управления пакетами для Go, аналогичного CPAN для Perl или системы Cargo Rust или системы npm в Node . [79]

Параллелизм: горутины и каналы [ править ]

Язык Go имеет встроенные средства, а также поддержку библиотеки для написания параллельных программ . Параллелизм относится не только к параллелизму ЦП, но и к асинхронности : позволяет выполнять медленные операции, такие как чтение из базы данных или сеть, в то время как программа выполняет другую работу, что является обычным для серверов, основанных на событиях. [80]

Первичная конструкция параллелизма - это горутина , тип облегченного процесса . Вызов функции с префиксом goключевого слова запускает функцию в новой горутине. В спецификации языка не указано, как должны быть реализованы горутины, но текущие реализации мультиплексируют горутины процесса Go на меньший набор потоков операционной системы , аналогично планированию, выполняемому в Erlang . [81] : 10

Хотя доступен стандартный пакет библиотеки, содержащий большинство классических структур управления параллелизмом ( блокировки мьютексов и т. Д.), [81] : 151–152 идиоматические параллельные программы вместо этого предпочитают каналы , которые обеспечивают отправку сообщений между горутинами. [82] Дополнительные буферы хранят сообщения в порядке FIFO [64] : 43 и позволяют отправлять горутины до того, как их сообщения будут получены. [ необходима цитата ]

Каналы набирается, так что канал типа чан T может быть использован только для передачи сообщений типа T . Для работы с ними используется специальный синтаксис; <-ch - это выражение, которое заставляет выполняющуюся горутину блокироваться до тех пор, пока значение не поступит по каналу ch , в то время как ch <- x отправляет значение x (возможно, блокировка до тех пор, пока значение не будет получено другой горутиной). Встроенный переключатель -like выберите заявление может быть использована для реализации неблокируемой связи по нескольким каналам; см. нижедля примера. В Go есть модель памяти, описывающая, как горутины должны использовать каналы или другие операции для безопасного обмена данными. [83]

Наличие каналов отличает Go от параллельных языков в стиле модели акторов, таких как Erlang, где сообщения адресованы непосредственно акторам (что соответствует горутинам). Стиль актера можно смоделировать в Go, поддерживая взаимно однозначное соответствие между горутинами и каналами, но язык позволяет нескольким горутинам совместно использовать канал или одной горутине для отправки и приема по нескольким каналам. [81] : 147

С помощью этих инструментов можно создавать параллельные конструкции, такие как рабочие пулы, конвейеры (в которых, скажем, файл распаковывается и анализируется по мере загрузки), фоновые вызовы с тайм-аутом, параллельные вызовы «разветвления» к набору служб и другие. . [84] Каналы также нашли применение, выходящее за рамки обычного понятия межпроцессного взаимодействия, например, служение безопасным для параллелизма списком повторно используемых буферов, [85] реализация сопрограмм (которые вдохновили название goroutine ) [86] и реализация итераторов . [87]

Связанные с параллелизмом структурные соглашения Go ( каналы и альтернативные входные каналы) получены из модели последовательных процессов взаимодействия Тони Хоара . В отличие от предыдущих языков параллельного программирования, таких как Occam или Limbo (язык, на котором работал соавтор Go Роб Пайк), [88] Go не предоставляет никаких встроенных понятий безопасного или проверяемого параллелизма. [89] Хотя в Go отдают предпочтение модели коммуникационных процессов, она не единственная: все горутины в программе используют единое адресное пространство. Это означает, что изменяемые объекты и указатели могут совместно использоваться горутинами; см. § «Отсутствие безопасности в условиях гонки» ниже. [цитата необходима ]

Пригодность для параллельного программирования [ править ]

Хотя признаки параллельности Гоу не направлены в первую очередь на параллельной обработки , [80] , они могут быть использованы для программы совместного использования памяти многопроцессорных машин. Были проведены различные исследования эффективности этого подхода. [90] В одном из этих исследований сравнивали размер (в строках кода ) и скорость программ, написанных опытным программистом, не знакомым с языком, и исправления этих программ экспертом Go (из группы разработчиков Google), делая то же самое для Часовня , Силк и Intel TBB . Исследование показало, что неспециалисты склонны писать алгоритмы « разделяй и властвуй» с однимgo на рекурсию, в то время как эксперт писал программы распределения-работы-синхронизации, используя одну горутину на процессор. Программы эксперта были обычно быстрее, но и длиннее. [91]

Отсутствие безопасности условий гонки [ править ]

Нет никаких ограничений на то, как горутины получают доступ к общим данным, что делает возможными условия гонки . В частности, если программа явно не синхронизируется через каналы или другие средства, записи из одной горутины могут быть частично, полностью или вообще не видны для другой, часто без каких-либо гарантий порядка записи. [89] Кроме того, внутренние структуры данных Go, такие как значения интерфейса, заголовки фрагментов, хэш-таблицы и заголовки строк, не защищены от условий гонки, поэтому безопасность типов и памяти может быть нарушена в многопоточных программах, которые изменяют общие экземпляры этих типов без синхронизации. [92] [93]Таким образом, вместо языковой поддержки безопасное параллельное программирование опирается на соглашения; например, Chisnall рекомендует идиому под названием «aliases xor mutable», означающую, что передача изменяемого значения (или указателя) по каналу сигнализирует о передаче права собственности на значение его получателю. [81] : 155

Двоичные файлы [ править ]

Компоновщик в цепочке инструментов gc по умолчанию создает статически связанные двоичные файлы, поэтому все двоичные файлы Go включают среду выполнения Go. [94] [95]

Упущения [ править ]

Go намеренно опускает некоторые функции, общие для других языков, включая (реализацию) наследование , универсальное программирование , утверждения , арифметику указателей [e] , неявные преобразования типов [d] , объединения без тегов , [f] и объединения с тегами . [g] Дизайнеры добавили только те объекты, о которых договорились все трое. [98]

Из пропущенных языковых функций разработчики явно возражают против утверждений и арифметики указателей, защищая при этом отказ от наследования типов как более полезный язык, поощряя вместо этого использование интерфейсов для достижения динамической диспетчеризации [h] и композиции для повторного использования кода. На самом деле композиция и делегирование в значительной степени автоматизированы за счет встраивания структур ; по мнению исследователей Schmager et al., эта функция "имеет много недостатков наследования: она влияет на общедоступный интерфейс объектов, она не является мелкозернистой (т.е. отсутствует контроль над внедрением на уровне метода), методы встроенных объектов не могут быть скрыты, и она статична. ", что делает" не очевидным ", будут ли программисты злоупотреблять им до такой степени, что программисты на других языках, как считается, злоупотребляют наследованием. [63]

Разработчики выражают открытость к общему программированию и отмечают, что встроенные функции на самом деле являются общими типами, но они рассматриваются как особые случаи; Пайк называет это слабостью, которую в какой-то момент можно изменить. [55] Команда Google создала по крайней мере один компилятор для экспериментального диалекта Go с универсальными шаблонами, но не выпустила его. [99] Они также открыты для стандартизации способов применения генерации кода. [100] В июне 2020 года был опубликован новый проект проектного документа [101] , который добавит в Go необходимый синтаксис для объявления универсальных функций и типов. Инструмент перевода кода go2goбыл предоставлен, чтобы пользователи могли опробовать новый синтаксис вместе с версией онлайн-игры Go Playground с поддержкой универсальных шаблонов. [102]

Первоначально опущенный механизм паники / восстановления, подобный исключениям, был в конечном итоге добавлен, который авторы Go советуют использовать для неисправимых ошибок, таких как те, которые должны остановить всю программу или запрос сервера, или в качестве ярлыка для распространения ошибок вверх по стеку внутри пакета. (но не за пределами пакета; там возврат ошибок - это стандартный API). [103] [104] [105] [106]

Стиль [ править ]

Авторы Go приложили значительные усилия, чтобы повлиять на стиль программ Go:

  • Отступы, интервалы и другие поверхностные детали кода автоматически стандартизируются gofmtинструментом. [107] golint автоматически выполняет дополнительные проверки стиля. [ необходима цитата ]
  • Инструменты и библиотеки, распространяемые вместе с Go, предлагают стандартные подходы к таким вещам, как документация по API ( godoc), [108] тестирование ( go test), построение ( go build), управление пакетами ( go get) и так далее.
  • Go применяет правила, которые рекомендуются для других языков, например, запрещает циклические зависимости, неиспользуемые переменные [109] или импорт, [110] и неявные преобразования типов.
  • Упущение некоторых функций (например, ярлыки функционально-программирование , как mapи Java-стиль try/ finallyблоки) , как правило , поощрять конкретный явный, конкретный и императивный стиль программирования.
  • В первый день команда Go опубликовала сборник идиом Go [108], а позже также собрала комментарии по обзору кода, [111] доклады [112] и официальные сообщения в блогах [113], чтобы научить стилю Go и философии программирования.

Инструменты [ править ]

В основной дистрибутив Go входят инструменты для сборки , тестирования и анализа кода:

  • go build, который создает двоичные файлы Go, используя только информацию из самих исходных файлов, без отдельных make-файлов
  • go test, для модульного тестирования и микротестов
  • go fmt, для форматирования кода
  • go get, для получения и установки удаленных пакетов
  • go vet, статический анализатор, ищущий возможные ошибки в коде
  • go run, ярлык для создания и выполнения кода
  • godoc, для отображения документации или обслуживания ее через HTTP
  • gorename, для переименования переменных, функций и т. д. безопасным для типов способом
  • go generate, стандартный способ вызова генераторов кода

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

Экосистема сторонних инструментов дополняет стандартный дистрибутив, например gocode, который позволяет автозаполнение кода во многих текстовых редакторах, goimportsавтоматически добавляет / удаляет импорт пакетов по мере необходимости и errcheckобнаруживает код, который может непреднамеренно игнорировать ошибки.

Примеры [ править ]

Привет, мир [ править ]

 основной пакетимпорт  "FMT"func  main ()  {  fmt . Println ( "Привет, мир!" ) }

где «FMT» является пакет для отформатирован ввода / вывода , аналогично языка C входной C файл / вывода . [114]

Параллелизм [ править ]

Следующая простая программа демонстрирует возможности параллелизма в Go для реализации асинхронной программы. Он запускает два легких потока («горутины»): один ждет, пока пользователь наберет текст, а другой реализует тайм-аут. Оператор select ожидает, пока одна из этих горутин отправит сообщение в основную подпрограмму, и воздействует на первое поступившее сообщение (пример, адаптированный из книги Дэвида Чизнолла). [81] : 152

 основной пакетimport  (  "fmt"  "время" )func  readword ( ch  chan  string )  {  fmt . Println ( «Введите слово, затем нажмите Enter.» )  Var  word  string  fmt . Scanf ( "% s" ,  & word )  ch  <-  word }func  timeout ( t  chan  bool )  {  время . Сон ( 5  *  раз . Секунда )  t  <-  false }func  main ()  {  t  : =  make ( chan  bool )  go  timeout ( t ) ch  : =  make ( chan  string )  go  readword ( ch ) выберите  {  case  word  : =  <- ch :  fmt . Println ( "Получено" ,  слово )  case  <- t :  fmt . Println ( "Тайм-аут." )  } }

Тестирование [ править ]

Пакет тестирования обеспечивает поддержку автоматического тестирования пакетов go. [115] Пример целевой функции:

func  ExtractUsername ( строка электронной почты  ) строка { at : = strings . Индекс ( электронная почта , "@" ) обратный адрес электронной почты [: at ] }      

Тестовый код (обратите внимание, что ключевое слово assert отсутствует в Go; тесты находятся в <filename> _test.go в том же пакете):

импорт  (  «тестирование»  )func  TestExtractUsername ( t  * testing . T )  { t . Run ( "без точки" ,  func ( t  * testing . T )  { username  : =  ExtractUsername ( "[email protected]" ) if  username  ! =  "R"  { t . Fatalf ( "Got:% v \ n" ,  username ) } })т . Run ( "withDot" ,  func ( t  * testing . T )  { username  : =  ExtractUsername ( "[email protected]" ) if  username  ! =  "Jonh.smith"  { t . Fatalf ( "Got:% v \ n " ,  имя пользователя ) } })}

Есть возможность запускать тесты параллельно.

Веб-приложение [ править ]

Пакет net / http обеспечивает поддержку для создания веб-приложений.

В этом примере будет показано "Hello world!" когда посещается localhost: 8080.

import  (  "fmt"  "log"  "net / http"  )func  helloFunc ( w  http . ResponseWriter ,  r  * http . Request )  {  fmt . Fprintf ( w , «Привет, мир!» ) }func  main ()  {  http . HandleFunc ( "/" , helloFunc )  журнала . Fatal ( http . ListenAndServe ( ": 8080" ,  nil )) }

Приложения [ править ]

Некоторые известные приложения с открытым исходным кодом, написанные на Go, включают: [116]

  • Caddy , веб-сервер HTTP / 2 с открытым исходным кодом и автоматической поддержкой HTTPS.
  • CockroachDB , открытая, отказоустойчивая, строго согласованная, масштабируемая база данных SQL.
  • Docker , набор инструментов для развертывания контейнеров Linux
  • EdgeX , платформа с открытым исходным кодом , не зависящая от поставщика, размещенная на базе Linux Foundation , обеспечивающая общую основу для промышленных периферийных вычислений IoT [117]
  • Hugo , генератор статических сайтов
  • InfluxDB , база данных с открытым исходным кодом, специально предназначенная для обработки данных временных рядов с высокой доступностью и высокими требованиями к производительности.
  • Межпланетная файловая система , одноранговый гипермедиа протокол с адресацией по содержанию [118]
  • Juju , инструмент оркестровки сервисов от Canonical , упаковщиков Ubuntu Linux
  • Система управления контейнерами Kubernetes
  • lnd, реализация сети Bitcoin Lightning [119]
  • Mattermost , система командного чата
  • NATS Messaging , система обмена сообщениями с открытым исходным кодом, в которой представлены основные принципы проектирования производительности, масштабируемости и простоты использования [120]
  • OpenShift , платформа облачных вычислений как услуга от Red Hat
  • Rclone , программа командной строки для управления файлами в облачном хранилище и других сервисах с высокой задержкой.
  • Snappy , менеджер пакетов для Ubuntu Touch, разработанный Canonical
  • Syncthing , клиент-серверное приложение для синхронизации файлов с открытым исходным кодом
  • Terraform , инструмент для предоставления нескольких облачных инфраструктур с открытым исходным кодом от HashiCorp
  • TiDB , с открытым исходным кодом, распределенных ПЗВП базы данных совместим с протоколом MySQL от PingCAP

Другие известные компании и сайты, использующие Go (как правило, вместе с другими языками, а не исключительно), включают:

  • Cacoo за рендеринг страницы пользовательской панели и микросервиса с использованием Go и gRPC [121]
  • Chango , рекламная компания с алгоритмической продажей , использует Go в своих системах ставок в реальном времени [122]
  • Cloud Foundry , платформа как услуга [123]
  • Cloudflare , за их прокси-сервер с дельта-кодированием Railgun, их распределенную службу DNS, а также инструменты для криптографии, регистрации, потоковой обработки и доступа к сайтам SPDY [124] [125]
  • Контейнер Linux (ранее CoreOS), операционная система на основе Linux, использующая контейнеры Docker [126] и контейнеры rkt.
  • Couchbase , службы запросов и индексирования на сервере Couchbase [127]
  • Dropbox , который перенес некоторые из своих критически важных компонентов с Python на Go [128]
  • Ethereum , реализация go-ethereum блокчейна виртуальной машины Ethereum для криптовалюты Ether [129]
  • Gitlab , а веб- DevOps жизненного цикла инструмента , который обеспечивает Git - репозиторий , вика , отслеживание проблем , непрерывная интеграцию , развертывание особенности трубопровода [130]
  • Google , для многих проектов, в частности, включая сервер загрузки dl.google.com [131] [132] [133]
  • Heroku , для Doozer, служба блокировки [15]
  • Hyperledger Fabric , корпоративный проект распределенной бухгалтерской книги с открытым исходным кодом
  • MongoDB , инструменты для администрирования экземпляров MongoDB [134]
  • Netflix за две части их серверной архитектуры [135]
  • Nutanix , для различных микросервисов в своей корпоративной облачной ОС [136]
  • Plug.dj , интерактивный веб-сайт с потоковой передачей музыки в социальных сетях [137]
  • SendGrid , служба доставки и управления транзакционной электронной почтой из Боулдера, штат Колорадо. [138]
  • SoundCloud , для «десятков систем» [139]
  • Splice для всего бэкенда (API и парсеры) их онлайн-платформы для совместной работы с музыкой [140]
  • ThoughtWorks , некоторые инструменты и приложения для непрерывной доставки и обмена мгновенными сообщениями (CoyIM) [141]
  • Twitch , за их систему чата на основе IRC (перенесенная с Python) [142]
  • Uber , для обработки больших объемов геозонов -Ы запросов [143]

Прием [ править ]

Интерфейсная система и преднамеренное отсутствие наследования были высоко оценены Микеле Симионато, который сравнил эти характеристики с характеристиками Standard ML , назвав «позором, что ни один популярный язык не пошел по [этому] конкретному пути». [144]

Дэйв Астелс из Engine Yard писал: [145]

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

Go был назван языком программирования года индексом сообщества программистов TIOBE в первый год, 2009, за больший 12-месячный рост популярности (всего за 2 месяца после его введения в ноябре), чем любой другой язык в этом году. и занял 13-е место к январю 2010 года [146], превзойдя известные языки, такие как Паскаль . К июню 2015 года его рейтинг опустился ниже 50-го места в рейтинге, став ниже, чем COBOL и Fortran . [147] Но по состоянию на январь 2017 года его рейтинг поднялся до 13-го места, что свидетельствует о значительном росте популярности и принятия. Go был признан языком программирования TIOBE 2016 года.

Брюс Экель заявил: [148]

Сложность C ++ (в новом C ++ добавлена ​​еще большая сложность) и связанное с этим влияние на производительность больше не оправданы. Все трудности, которые пришлось преодолеть программисту на C ++, чтобы использовать C-совместимый язык, больше не имеют смысла - они просто пустая трата времени и усилий. Go имеет гораздо больше смысла для класса задач, для решения которых изначально предназначался C ++.

Оценка языка и его реализации gc в 2011 году по сравнению с C ++ ( GCC ), Java и Scala инженером Google показала:

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

-  Р. Хундт [149]

Оценка получила опровержение со стороны команды разработчиков Go. Ян Лэнс Тейлор, который улучшил код Go для статьи Хундта, не знал о намерении опубликовать свой код и говорит, что его версия «никогда не предназначалась для того, чтобы быть примером идиоматического или эффективного Go»; Затем Расс Кокс оптимизировал код Go, а также код C ++, и заставил код Go работать немного быстрее, чем C ++, и более чем на порядок быстрее, чем код в статье. [150]

Спор о названии [ править ]

10 ноября 2009 года, в день общего выпуска языка, Фрэнсис МакКейб, разработчик Go! язык программирования (обратите внимание на восклицательный знак), запросил изменение названия языка Google, чтобы избежать путаницы с его языком, на разработку которого он потратил 10 лет. [151] МакКейб выразил обеспокоенность тем, что «этот« большой парень »в конечном итоге обрушится на него», и это беспокойство нашло отклик у более чем 120 разработчиков, которые прокомментировали официальную ветку проблем Google, говоря, что им следует изменить имя, с некоторыми [ 152], даже говоря, что проблема противоречит девизу Google: « Не будь злом» . [153]

12 октября 2010 г. проблема была закрыта разработчиком Google Рассом Коксом (@rsc) с пользовательским статусом «Несчастный», сопровождаемым следующим комментарием:

«Есть много компьютерных продуктов и услуг под названием Go. За 11 месяцев, прошедших с момента нашего выпуска, произошло минимальное смешение двух языков». [153]

Критика [ править ]

Критики Go говорят, что:

  • Отсутствие параметрического полиморфизма для универсального программирования приводит к дублированию кода или небезопасным преобразованиям типов и многословию, нарушающему поток. [154] [155] [156] [157]
  • Нулевое значение Go в сочетании с отсутствием алгебраических типов приводит к трудностям при обработке сбоев и базовых случаев . [154] [156]
  • Go не допускает появления открывающей скобки на отдельной строке, что заставляет всех программистов Go использовать один и тот же стиль скобок. [158]
  • Семантика файлов в стандартной библиотеке Go в значительной степени основана на семантике POSIX, и они плохо отображаются на платформе Windows . [159] [160] Обратите внимание, что эта проблема не является специфической для Go, но другие языки программирования решили ее с помощью четко определенных стандартных библиотек. Автор также утверждает, что простота Go является иллюзией и что для решения реальных проблем необходимо задействовать библиотеки с удивительно большими зависимостями, чтобы решить такую ​​простую задачу, как реализация монотонно увеличивающейся функции времени.

См. Также [ править ]

  • Сравнение языков программирования

Заметки [ править ]

  1. ^ Но «Чтобы сложные операторы занимали одну строку, точка с запятой может быть опущена перед закрытием) или}». [50]
  2. ^ «Если новая строка стоит после токена, который может закончить оператор, [лексический анализатор] вставит точку с запятой». [51]
  3. ^ Обычно ровно одно из значений результата и ошибки имеет значение, отличное от нулевого значения типа; иногда и то, и другое, например, когда чтение или запись могут быть завершены только частично, а иногда и то, и другое, например, когда чтение возвращает 0 байтов. См. Раздел Проблема полипредиката: многозначный возврат .
  4. ^ a b Часто задаваемые вопросы по языку «Почему нет арифметики с указателями? Безопасность… никогда не извлекайте недопустимый адрес, который работает неправильно… использование индексов массива может быть столь же эффективным, как… арифметика с указателями… упростить реализацию сборщика мусора…». [12]
  5. ^ Часто задаваемые вопросы по языку «Почему в Go нет утверждений?… Наш опыт показывает, что программисты используют их как костыль, чтобы не думать о правильной обработке ошибок и составлении отчетов…». [12]
  6. ^ Часто задаваемые вопросы по языку «Почему нет немаркированных союзов…? [Они] нарушили бы гарантии безопасности памяти Go». [12]
  7. ^ Часто задаваемые вопросы по языку «Почему у Go нет вариантов типов?… Мы рассмотрели [их, но] они сбивают с толку интерфейсы… [Некоторые] некоторые варианты адресов уже охвачены,… хотя и не так элегантно». [12] (Доступ ктегу типа интерфейса [96] осуществляется с помощью утверждения типа [97] ).
  8. ^ Вопросы "Как получить динамическую отправку методов?" и «Почему нет наследования типов?» в языковом FAQ. [12]

Ссылки [ править ]

  1. ^ «Первоклассные функции в Go» . Проверено 14 ноября 2018 года . Go поддерживает ... стиль функционального программирования на строго типизированном языке.
  2. ^ "Является ли Go объектно-ориентированным языком?" . Проверено 13 апреля 2019 года . Хотя Go имеет типы и методы и допускает объектно-ориентированный стиль программирования, иерархии типов здесь нет.
  3. ^ «Go: код, который растет с изяществом» . Проверено 24 июня 2018 года . Go является объектно-ориентированным, но не обычным способом.
  4. ^ a b «ЛИЦЕНЗИЯ на текстовый файл» . Язык программирования Go . Проверено 5 октября 2012 года .
  5. ^ «История выпуска» . Проверено 13 марта 2021 года .
  6. ^ a b «Почему в Go нет деклараций« орудия »?» . golang.org . Проверено 1 октября 2015 года .
  7. Пайк, Роб (22 декабря 2014 г.). «Роб Пайк в Твиттере» . Проверено 13 марта 2016 года . В Go есть структурная типизация, а не утиная типизация. Полное соответствие интерфейсу проверено и обязательно.
  8. ^ "lang / go: go-1.4 - язык программирования Go" . Порты OpenBSD . 23 декабря 2014 . Проверено 19 января 2015 года .
  9. ^ "Перенести усилия" . Языковые ресурсы Go . кошка-v. 12 января 2010 . Проверено 18 января 2010 года .
  10. ^ «Предоставление дополнительных прав интеллектуальной собственности» . Язык программирования Go . Проверено 5 октября 2012 года .
  11. ^ a b Пайк, Роб (24 апреля 2014 г.). «Привет суслики» . Проверено 11 марта 2016 года .
  12. ^ a b c d e f g «Часто задаваемые вопросы по языковому дизайну» . golang.org . 16 января 2010 . Проверено 27 февраля 2010 года .
  13. ^ «Эволюция го» . Проверено 26 сентября 2015 года .
  14. Кинкейд, Джейсон (10 ноября 2009 г.). «Google's Go: новый язык программирования, который соответствует Python и C ++» . TechCrunch . Проверено 18 января 2010 года .
  15. ^ a b Мец, Кейд (5 мая 2011 г.). «Google Go смело идет туда, где раньше не было кода» . Реестр .
  16. ^ "Этот язык называется Го или Голанг?" . Проверено 26 марта 2020 года . Язык называется Go.
  17. ^ «Примечания к выпуску Go 1.5» . Проверено 28 января, 2016 . Компилятор и среда выполнения теперь реализованы на Go и ассемблере без C.
  18. ^ «Выпущен Go 1.11 - Блог Go» . 24 августа 2018 . Проверено 1 января 2019 года .
  19. ^ «FAQ: Реализация» . golang.org . 16 января 2010 . Проверено 18 января 2010 года .
  20. ^ «Установка GCC: Конфигурация» . Проверено 3 декабря 2011 года . Ada, Go и Objective-C ++ не являются языками по умолчанию
  21. ^ "Компилятор от Go до JavaScript для запуска кода Go в браузере: Gopherjs / Gopherjs" . 18 апреля 2020.
  22. ^ «Перейти в Google: языковой дизайн на службе разработки программного обеспечения» . Проверено 8 октября 2018 года .
  23. Пайк, Роб (28 апреля 2010 г.). «Еще одна попытка языкового дизайна» . Стэнфордский коллоквиум по компьютерным системам . Стэнфордский университет . Видео доступно .
  24. ^ «Часто задаваемые вопросы (FAQ) - язык программирования Go» . golang.org . Проверено 26 февраля, 2016 .
  25. ^ Бинсток, Эндрю (18 мая 2011). «Доктор Добб: Интервью с Кеном Томпсоном» . Проверено 7 февраля 2014 года .
  26. ^ Пайк, Роб (2012). «Меньше значит экспоненциально больше» .
  27. ^ Гриземер, Роберт (2015). «Эволюция го» .
  28. ^ Гриземер, Роберт; Пайк, Роб; Томпсон, Кен; Тейлор, Ян; Кокс, Расс; Ким, Джини; Лэнгли, Адам. "Эй, пойдем!" . Google с открытым исходным кодом . Проверено 17 мая 2018 года .
  29. ^ Шенкленд, Стивен (30 марта 2012). «Языку Google Go исполняется один год, он занимает место на YouTube: язык программирования нижнего уровня достаточно зрел, чтобы иметь номер версии 1.0. И он используется для реальной работы в Google» . Новости. CNet . CBS Interactive Inc . Проверено 6 августа 2017 года . Google выпустила версию 1 своего языка программирования Go, амбициозную попытку улучшить гигантов мира программирования нижнего уровня, таких как C и C ++.
  30. ^ «История выпуска - язык программирования Go» . golang.org .
  31. ^ "Часто задаваемые вопросы о Go: Google использует Go для внутренних целей?" . Проверено 9 марта 2013 года .
  32. ^ «Шрифты Go - Блог Go» . Идти. 16 ноября 2016 . Проверено 12 марта 2019 года .
  33. ^ "Перейти к шрифтам TTF" . GitHub . Проверено 2 апреля 2019 года .
  34. ^ "Новый бренд Go" . Блог Go . Проверено 9 ноября 2018 года .
  35. ^ "Перейти 2 проекта дизайна" . Проверено 12 сентября 2018 года .
  36. ^ «Блог Go: Go 2 проекта дизайна» . 28 августа 2018.
  37. ^ «Go 1 и будущее программ Go - язык программирования Go» . golang.org .
  38. ^ «Примечания к выпуску Go 1.14 - язык программирования Go» . golang.org .
  39. ^ «История выпуска - язык программирования Go» . golang.org .
  40. ^ «История выпуска» . Язык программирования Go . Проверено 24 августа 2018 года .
  41. ^ «Примечания к выпуску Go 1.11 - язык программирования Go» .
  42. ^ «Общие сведения о DoS взаимной аутентификации Golang TLS - CVE-2018-16875» . 19 декабря 2018.
  43. ^ «Работа с ошибками в Go 1.13 - Блог Go» . blog.golang.org . Проверено 11 марта 2021 года . Go 1.13 вводит новые функции в пакеты стандартных библиотек ошибок и fmt, чтобы упростить работу с ошибками, которые содержат другие ошибки. Наиболее важным из них является соглашение, а не изменение: ошибка, содержащая другую, может реализовывать метод Unwrap, возвращающий основную ошибку. Если e1.Unwrap () возвращает e2, то мы говорим, что e1 обертывает e2, и что вы можете развернуть e1, чтобы получить e2.
  44. ^ a b «Примечания к выпуску Go 1.14 - язык программирования Go» .
  45. ^ Пайк, Роб. «Язык программирования Go» . YouTube . Проверено 1 июля 2011 года .
  46. Пайк, Роб (10 ноября 2009 г.). Язык программирования Go (FLV) (Технический разговор). Google. Событие происходит в 8:53.
  47. ^ Скачайте и установите пакеты и зависимости - go - The Go Programming Language ; см. godoc.org для получения адресов и документации некоторых пакетов.
  48. ^ "GoDoc" . godoc.org .
  49. Роб Пайк, вподкасте « Журнал изменений» .
  50. ^ "Спецификация языка программирования Go, §Полуколонки" . golang.org .
  51. ^ "Эффективный Go, §Полуколоны" . golang.org .
  52. ^ https://golang.org/ref/spec#For_statements
  53. Роб Пайк, Строки, байты, руны и символы в Go , 23 октября 2013 г.
  54. ^ Докси, Калеб. «Структуры и интерфейсы - Введение в программирование на Go» . www.golang-book.com . Проверено 15 октября 2018 года .
  55. ^ a b Пайк, Роб (26 сентября 2013 г.). «Массивы, ломтики (и строка): механика„Append » . Блог Go . Проверено 7 марта 2015 года .
  56. ^ Эндрю Герранд, Go Slices : использование и внутреннее устройство .
  57. ^ Авторы Go, Effective Go: Slices .
  58. ^ Авторы Go Selectors - Спецификация языка программирования Go и вызовы - Спецификация языка программирования Go .
  59. ^ «Спецификация языка программирования Go, §Package unsafe» . golang.org .
  60. ^ «Спецификация языка программирования Go» . golang.org .
  61. ^ «Спецификация языка программирования Go» . golang.org .
  62. ^ «Спецификация языка программирования Go» . golang.org .
  63. ^ a b Шмагер, Франк; Кэмерон, Николас; Благородный, Джеймс (2010). GoHotDraw: оценка языка программирования Go с помощью шаблонов проектирования . Оценка и удобство использования языков и инструментов программирования. ACM.
  64. ^ a b Саммерфилд, Марк (2012). Программирование на Go: создание приложений для 21 века . Эддисон-Уэсли.
  65. ^ а б в г д Бальберт, Иво (2012). The Way to Go: тщательное введение в язык программирования Go . iUniverse.
  66. ^ «Эволюция го» . talk.golang.org . Проверено 13 марта 2016 года .
  67. ^ Diggins, Кристофер (24 ноября 2009). «Утиный ввод и язык программирования Go» . Доктора Добба . Проверено 10 марта 2016 года .
  68. ^ Ryer, Mat (1 декабря 2015). «Утка печатает на Go» . Проверено 10 марта 2016 года .
  69. ^ «Часто задаваемые вопросы (FAQ) - язык программирования Go» . golang.org .
  70. ^ «Спецификация языка программирования Go» . golang.org .
  71. ^ «Спецификация языка программирования Go» . golang.org .
  72. ^ отражать.ValueOf (i interface {}) преобразуетinterface{}в,reflect.Valueкоторый может быть дополнительно исследован
  73. ^ "карта [строка] интерфейс {} в Go" . bitfieldconsulting.com .
  74. ^ «Структуры данных Go: интерфейсы» . Проверено 15 ноября 2012 года .
  75. ^ «Спецификация языка программирования Go» . golang.org .
  76. ^ «Учебник по языку программирования Go» . Язык программирования Go . Проверено 10 марта 2013 года . В Go правило видимости информации простое: если имя (типа верхнего уровня, функции, метода, константы или переменной либо поля или метода структуры) написано с заглавной буквы, пользователи пакета могут его увидеть. В противном случае имя и, следовательно, именуемая вещь видны только внутри пакета, в котором оно объявлено.
  77. ^ "go - язык программирования Go" . golang.org .
  78. ^ «Как написать код Go» . golang.org . Пакеты из стандартной библиотеки получают короткие пути импорта, такие как «fmt» и «net / http». Для ваших собственных пакетов вы должны выбрать базовый путь, который вряд ли столкнется с будущими дополнениями к стандартной библиотеке или другим внешним библиотекам. Если вы где-то храните свой код в исходном репозитории, тогда вы должны использовать корень этого исходного репозитория в качестве базового пути. Например, если у вас есть пример учетной записи по адресу example.com/user, это должен быть ваш базовый путь.
  79. ^ «Перейти к процессу предложения упаковки» . Документы Google .
  80. ^ a b Роб Пайк, Параллелизм - это не параллелизм .
  81. ^ a b c d e Чисналл, Дэвид (2012). Разговорник на языке программирования Go . Эддисон-Уэсли. ISBN 9780132919005.
  82. ^ «Эффективный ход» . golang.org .
  83. ^ "Модель памяти Go" . Проверено 10 апреля 2017 года .
  84. ^ "Перейти к шаблонам параллелизма" . golang.org .
  85. ^ Джон Грэм-Камминг, Переработка буферов памяти в Go
  86. ^ "tree.go" .
  87. ^ Юэн Чеслак-Постава, Итераторы в Go .
  88. ^ Брайан В. Керниган, Спуск в неопределенность
  89. ^ а б «Модель памяти Go» . Проверено 5 января 2011 года .
  90. ^ Тан, Peiyi (2010). Многоядерное параллельное программирование на Go (PDF) . Proc. Первая международная конференция по передовым вычислениям и коммуникациям.
  91. ^ Нанц, Себастьян; Уэст, Скотт; Соареш да Силвейра, Кауэ. Изучение пробелов в специалистах по параллельному программированию (PDF) . Euro-Par 2013. CiteSeerX 10.1.1.368.6137 .  
  92. ^ Расс Кокс , Вперед в гонки .
  93. Пайк, Роб (25 октября 2012 г.). «Перейти в Google: языковой дизайн на службе разработки программного обеспечения» . Google, Inc. «Есть одно важное предостережение: Go не является исключительно безопасным для памяти при наличии параллелизма».
  94. ^ «Часто задаваемые вопросы (FAQ) - язык программирования Go» .
  95. ^ "История толстого двоичного файла" . 21 сентября 2018.
  96. ^ "Спецификация языка программирования Go, § Типы интерфейсов" . golang.org .
  97. ^ "Спецификация языка программирования Go, § Типовые утверждения" . golang.org .
  98. ^ Все системы работают . informIT . 17 августа 2010 . Проверено 21 июня 2018 года .
  99. ^ "E2E: Эрик Мейер и Роберт Гриземер - Going Go" . Канал 9 . Microsoft. 7 мая 2012 г.
  100. ^ Роб Пайк, Генерация кода
  101. ^ «Параметры типа - Эскизный проект» . go.googlesource.com .
  102. ^ «Дженерики в Go» . bitfieldconsulting.com .
  103. ^ Паника и восстановление , Go wiki
  104. ^ «Еженедельная история снимков» . golang.org .
  105. ^ "Предложение по механизму, подобному исключению" . голанг-орехи . 25 марта 2010 . Проверено 25 марта 2010 года .
  106. ^ «Эффективный ход» . golang.org .
  107. ^ "gofmt - язык программирования Go" . golang.org . Проверено 5 февраля 2021 года .
  108. ^ a b «Эффективное движение» . golang.org .
  109. ^ «Неиспользуемые локальные переменные» . yourbasic.org . Проверено 11 февраля 2021 года .
  110. ^ «Импорт неиспользуемых пакетов» . yourbasic.org . Проверено 11 февраля 2021 года .
  111. ^ «Комментарии при проверке кода» . Проверено 3 июля 2018 года .
  112. ^ "Разговоры" . Проверено 3 июля 2018 года .
  113. ^ «Ошибки - это ценности» . Проверено 3 июля 2018 года .
  114. ^ "fmt - язык программирования Go" . golang.org . Проверено 8 апреля 2019 года .
  115. ^ «тестирование - язык программирования Go» . golang.org . Проверено 27 декабря 2020 года .
  116. ^ avelino / awesome-go: тщательно подобранный список классных фреймворков, библиотек и программного обеспечения Go , полученный 10 января 2018 г.
  117. ^ «Проект EdgeX Foundry» . GitHub . Проверено 6 февраля 2021 года .
  118. ^ "ipfs / go-ipfs" . GitHub . Проверено 1 июня 2018 года .
  119. ^ "lightningnetwork / lnd" , GitHub , получено 29 апреля 2020 г.
  120. ^ «NATS - система обмена сообщениями с открытым исходным кодом | Безопасная разработка собственных облачных приложений» .
  121. ^ "Разработка через тестирование в Go | Cacoo" . Каку . 29 июля 2016 . Проверено 1 июня 2018 года .
  122. ^ "Чанго" . GitHub .
  123. Рианна Хеллер, Мартин (17 июля 2014 г.). «Обзор: Cloud Foundry привносит мощность и совершенство в PaaS» . JavaWorld . Проверено 22 января 2019 года .
  124. Джон Грэм-Камминг, Go at CloudFlare
  125. ^ Джон Грэм-Камминг, Что мы делали с Go
  126. ^ "Перейти в CoreOS" . 25 ноября 2014 г.
  127. ^ "Couchbase" . GitHub .
  128. Патрик Ли, Open Sourcing Our Go Libraries , 7 июля 2014 г.
  129. ^ «Официальная реализация протокола Ethereum на Go» . GitHub . Эфириум. 18 апреля 2020.
  130. ^ «Почему мы используем Ruby on Rails для создания GitLab» . GitLab . Проверено 6 февраля 2021 года . Ruby был оптимизирован для разработчиков, а не для запуска его в производственной среде, - говорит Сид. - Что касается вещей, которые сильно пострадают и должны быть очень производительными или которые, например, должны очень долго ждать системного ввода-вывода, мы переписать их на Go… Мы все еще пытаемся заставить GitLab использовать меньше памяти. Итак, нам нужно включить многопоточность. Когда мы разрабатывали GitLab, этого не было в экосистеме Ruby on Rails. Сейчас это более распространено, но поскольку теперь у нас так много кода и так много зависимостей, это будет более длинный путь для нас, чтобы добраться туда. Это должно помочь; это не сделает его невероятно быстрым, но, по крайней мере, он будет использовать меньше памяти
  131. ^ "dl.google.com: Powered by Go" . golang.org .
  132. ^ Мэтт Уэлш, Переписывание большой производственной системы в Go
  133. ^ Дэвид Симондс, Высокопроизводительные приложения на Google App Engine
  134. ^ "Монго БД" . GitHub . 18 апреля 2020.
  135. ^ «Технический блог Netflix: кэширование данных приложений с помощью SSD» . 25 мая 2016 года.
  136. ^ "golang / go" . GitHub . 18 апреля 2020.
  137. ^ Стивен Сакс. «Поиск и продвижение» . plug.dj технический блог . Архивировано из оригинала на 11 июня 2015 года . Проверено 10 июня 2015 года .
  138. Тим Дженкинс (6 марта 2014 г.). «Как убедить вашу компанию пойти с Голангом» . Блог о доставке электронной почты SendGrid .
  139. ^ Питер Бургон, Go в SoundCloud архивной 11 ноября 2013, в Wayback Machine
  140. ^ "Посетите Google I / O и Gopher SummerFest - блог Go" . golang.org .
  141. ^ TWSTRIKE (17 апреля 2020 г.). "CoyIM" . Команда ThoughtWorks STRIKE .
  142. ^ Рис Хилтнер, Марш Go к сборке мусора с малой задержкой , 5 июля 2016 г.
  143. ^ «Как мы создали сервис Uber Engineering с максимальным количеством запросов в секунду с помощью Go» . Блог инженеров Uber . 24 февраля 2016 . Проверено 2 марта 2016 года .
  144. ^ Симионато, Мишель (15 ноября 2009). «Интерфейсы против наследования (или берегитесь Go!)» . артима . Проверено 15 ноября 2009 года .
  145. ^ Astels, Дэйв (9 ноября 2009). "На старт, внимание, марш!" . верфь . Проверено 9 ноября 2009 года .
  146. ^ jt (11 января 2010 г.). "Google's Go получает награду" Язык программирования года " . jaxenter . Проверено 5 декабря 2012 года .
  147. ^ «Индекс сообщества программистов TIOBE за июнь 2015 г.» . Программное обеспечение TIOBE. Июнь 2015 . Проверено 5 июля 2015 года .
  148. Брюс Экель (27 августа 2011 г.). «Вызов Go из Python через JSON-RPC» . Проверено 29 августа 2011 года .
  149. ^ Хундт, Роберт (2011). Распознавание петель в C ++ / Java / Go / Scala (PDF) . Дни Scala.
  150. ^ Metz, Кейд (1 июля 2011). «Google Go наносит ответный удар запеканием C ++» . Реестр .
  151. Перейти ↑ Brownlee, John (13 ноября 2009 г.). «Google не Google„Go“ , прежде чем назвать их язык программирования ' » .
  152. ^ Claburn, Томас (11 ноября 2009). «Название Google 'Go' вызывает обвинения в зле ' » . Информационная неделя . Проверено 18 января 2010 года .
  153. ^ a b «Проблема 9 - вперед - я уже использовал название для языка программирования * MY *» . Github . Google Inc. Retrieved октябрю +12, 2 010 .
  154. ^ a b Ягер, Уилл. «Почему идти не хорошо» . Проверено 4 ноября 2018 года .
  155. ^ Эльбра, Эгон. «Резюме обсуждений Go Generics» . Проверено 4 ноября 2018 года .
  156. ^ a b Добронски, Янош. «Ежедневные хлопоты в го» . Проверено 4 ноября 2018 года .
  157. ^ Фитцпатрик, Брэд. «Ступай: идеален на 90%, в 100% случаев» . Проверено 28 января, 2016 .
  158. ^ «Почему есть фигурные скобки, но нет точки с запятой? И почему я не могу поставить открывающую скобку на следующей строке?» . Проверено 26 марта 2020 года . Преимущества единого программного формата для всех программ Go значительно перевешивают любые предполагаемые недостатки конкретного стиля.
  159. ^ "Я хочу с Дикой Поездки мистера Голанга" . 28 февраля 2020 . Проверено 17 ноября 2020 года .
  160. ^ "предложение: os: Create / Open / OpenFile () set FILE_SHARE_DELETE на windows # 32088" . 16 мая 2019 . Проверено 17 ноября 2020 года .

Дальнейшее чтение [ править ]

  • Донован, Алан; Керниган, Брайан (октябрь 2015 г.). Язык программирования Go (1-е изд.). Эддисон-Уэсли Профессионал . п. 400. ISBN 978-0-13-419044-0.

Внешние ссылки [ править ]

  • Официальный веб-сайт