stringtranslate.com

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

Go — это статически типизированный , компилируемый высокоуровневый язык программирования общего назначения . Он был разработан в Google [12] в 2009 году Робертом Гриземером , Робом Пайком и Кеном Томпсоном . [4] Он синтаксически похож на C , но также имеет безопасность памяти , сборку мусора , структурную типизацию [7] и параллелизм в стиле CSP . [13] Его часто называют Golang из-за его бывшего доменного имени, , но его настоящее имя — Go. [14]golang.org

Существует два основных варианта реализации:

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

История

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

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

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

Брендинг и стиль

Талисманом языка программирования Go является изображенный выше суслик .

Талисман Gopher был представлен в 2009 году для запуска языка с открытым исходным кодом . Дизайн, разработанный Рене Френч , был заимствован из рекламной акции WFMU 2000 года . [31]

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

В апреле 2018 года оригинальный логотип был переработан дизайнером бренда Адамом Смитом. Новый логотип представляет собой современный стилизованный GO, наклоненный вправо с замыкающими обтекаемыми линиями. (Талисман Gopher остался прежним. [34] )

Дженерики

Отсутствие поддержки обобщенного программирования в начальных версиях Go вызвало значительную критику. [35] Разработчики выразили открытость для обобщенного программирования и отметили, что встроенные функции на самом деле были типово-обобщенными, но рассматривались как особые случаи; Пайк назвал это слабостью, которая может быть исправлена ​​в какой-то момент. [36] Команда Google создала по крайней мере один компилятор для экспериментального диалекта Go с обобщениями, но не выпустила его. [37]

В августе 2018 года основные участники проекта Go опубликовали проекты проектов для универсального программирования и обработки ошибок и попросили пользователей присылать отзывы. [38] [39] Однако предложение по обработке ошибок в конечном итоге было отклонено. [40]

В июне 2020 года был опубликован новый черновой проектный документ [41] , который должен был добавить необходимый синтаксис в Go для объявления универсальных функций и типов. Инструмент перевода кода go2go был предоставлен, чтобы позволить пользователям попробовать новый синтаксис, вместе с версией онлайн-площадки Go Playground с поддержкой универсальных шаблонов. [42]

Дженерики были окончательно добавлены в Go в версии 1.18 15 марта 2022 года. [43]

Версионирование

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

Go не следует SemVer ; вместо этого каждый основной релиз Go поддерживается до тех пор, пока не появятся два новых основных релиза. В отличие от большинства программ, Go называет вторую цифру в версии основной, т. е. является 1.x xосновной версией. [46] Это потому, что Go не планирует никогда достичь версии 2.0, учитывая, что совместимость является одним из главных преимуществ языка. [47]

Дизайн

Go находится под влиянием C (особенно диалекта Plan 9 [48] [ неудачная проверкасм. обсуждение ] ), но с упором на большую простоту и безопасность. Он состоит из:

Синтаксис

Синтаксис Go включает изменения по сравнению с C, направленные на сохранение краткости и читаемости кода. Был введен комбинированный оператор объявления/инициализации, который позволяет программисту писать или , не указывая типы используемых переменных. Это контрастирует с C и .i := 3s := "Hello, world!"int i = 3;const char *s = "Hello, world!";

Точка с запятой по-прежнему завершает операторы; [a] но подразумевается, когда наступает конец строки. [b]

Методы могут возвращать несколько значений, и возврат пары является общепринятым способом, которым метод сообщает об ошибке вызывающей стороне в Go. [c] Go добавляет литеральные синтаксисы для инициализации параметров структуры по имени и для инициализации карт и срезов . В качестве альтернативы трехоператорному циклу C выражения Go позволяют выполнять краткую итерацию по массивам, срезам, строкам, картам и каналам. [56]result, errforrange

Типы

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

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

Указатели доступны для всех типов, а указатель на тип T обозначается * T . Получение адреса и косвенность используют операторы & и * , как в C, или происходят неявно через вызов метода или синтаксис доступа к атрибуту. [61] [62] Арифметики указателей нет, [d] за исключением специального типа unsafe.Pointer в стандартной библиотеке. [63]

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

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

тип ipv4addr uint32  

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

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

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

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

// ZeroBroadcast сообщает, является ли addr 255.255.255.255. func ( addr ipv4addr ) ZeroBroadcast () bool { return addr == 0xFFFFFFFF }         

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

Система интерфейса

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

Первый — это встраивание , которое можно рассматривать как автоматизированную форму композиции . [70]

Вторым являются его интерфейсы , которые обеспечивают полиморфизм времени выполнения . [71] : 266  Интерфейсы являются классом типов и предоставляют ограниченную форму структурной типизации в иной номинальной системе типов Go. Объект, который имеет тип интерфейса, также имеет другой тип, во многом подобно объектам C++, которые одновременно являются базовым и производным классом. Интерфейсы Go были разработаны по протоколам из языка программирования Smalltalk. [72] Во многих источниках при описании интерфейсов Go используется термин «утиная типизация» . [73] [74] Хотя термин «утиная типизация» не определен точно и, следовательно, не является неправильным, он обычно подразумевает, что соответствие типам статически не проверяется. Поскольку соответствие интерфейсу Go статически проверяется компилятором Go (за исключением случаев выполнения утверждения типа), авторы Go предпочитают термин « структурная типизация» . [75]

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

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

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

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

Помимо вызова методов через интерфейсы, Go позволяет преобразовывать значения интерфейсов в другие типы с проверкой типа во время выполнения. Конструкции языка для этого — это утверждение типа [76] , которое проверяет единственный потенциальный тип:

var shp Shape = Square { 5 } square , ok := shp .( Square ) // Проверяет тип Square на shp, должно работать if ok { fmt . Printf ( "%#v\n" , square ) } else { fmt . Println ( "Невозможно напечатать форму как Square" ) ​​}             

и переключатель типа , [77] который проверяет по нескольким типам: [ необходима ссылка ]

func ( sq Square ) Diagonal ( ) float64 { return sq.side * math.Sqrt2 } func ( c Circle ) Dimeter ( ) float64 { return 2 * c.radius }                    func LongestContainedLine ( shp Shape ) float64 { switch v := shp .( type ) { case Square : return v . Diagonal () // Или, с утверждением типа, shp.(Square).Diagonal() case Circle : return v . Diameter () // Или, с утверждением типа, shp.(Circle).Diameter() default : return 0 // На практике это должно обрабатываться с ошибками } }                

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

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

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

Универсальный код с использованием параметризованных типов

Начиная с версии 1.18, Go поддерживает универсальный код с использованием параметризованных типов. [82]

Функции и типы теперь могут быть универсальными с использованием параметров типа. Эти параметры типа указываются в квадратных скобках, сразу после имени функции или типа. [83] Компилятор преобразует универсальную функцию или тип в неуниверсальный, заменяя аргументы типа на предоставленные параметры типа, либо явно пользователем, либо выводом типа компилятором. [84] Этот процесс преобразования называется инстанцированием типа. [85]

Интерфейсы теперь могут определять набор типов (известный как набор типов) с помощью |оператора (Union), а также набор методов. Эти изменения были сделаны для поддержки ограничений типов в коде обобщений. Для обобщенной функции или типа ограничение можно рассматривать как тип аргумента типа: метатип. Этот новый ~Tсинтаксис будет первым использованием ~в качестве токена в Go. ~Tозначает набор всех типов, базовым типом которых является T. [86]

тип Числовой интерфейс { ~ int | ~ float64 | ~ float32 | ~ int32 | ~ int64 }           func Add [ T Number ]( nums ... T ) T { var sum T for _ , v := range nums { sum += v } return sum }                func main () { add := Add [ int ] // Создание экземпляра типа println ( add ( 1 , 2 , 3 , 4 , 5 )) // 15          res := Add ( 1.1 , 2.2 , 3.3 , 4.4 , 5.5 ) // Вывод типа println ( res ) // +1.650000e+001 }        

Перечисляемые типы

Go использует iotaключевое слово для создания перечисляемых констант. [87]

тип ByteSize float64  const ( _ = iota // игнорировать первое значение, присваивая его пустому идентификатору KB ByteSize = 1 << ( 10 * iota ) MB GB )               

Система пакетов

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

Параллелизм: горутины и каналы

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

Первичная конструкция параллелизма — это goroutine , тип зеленого потока . [92] : 280–281  Вызов функции с префиксом в виде goключевого слова запускает функцию в новой goroutine. Спецификация языка не определяет, как должны быть реализованы goroutines, но текущие реализации мультиплексируют goroutines процесса Go на меньший набор потоков операционной системы , аналогично планированию, выполняемому в Erlang . [93] : 10 

Хотя стандартный пакет библиотеки, включающий большинство классических структур управления параллелизмом (блокировки мьютексов и т. д.), доступен, [93] : 151–152  идиоматические параллельные программы вместо этого предпочитают каналы , которые отправляют сообщения между горутинами. [94] Необязательные буферы хранят сообщения в порядке FIFO [95] : 43  и позволяют отправлять горутинам продолжать работу до получения их сообщений. [92] : 233 

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

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

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

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

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

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

Отсутствие безопасности гонки данных

Подход Go к параллелизму можно обобщить как «не общайтесь, разделяя память; разделяйте память, общаясь». [105] Нет никаких ограничений на то, как горутины получают доступ к общим данным, что делает возможными гонки данных . В частности, если программа явно не синхронизируется через каналы или другими способами, записи из одной горутины могут быть частично, полностью или вообще не видны другой, часто без каких-либо гарантий относительно порядка записей. [102] Более того, внутренние структуры данных Go , такие как значения интерфейсов, заголовки срезов, хэш-таблицы и заголовки строк, не защищены от гонок данных, поэтому безопасность типов и памяти может быть нарушена в многопоточных программах, которые изменяют общие экземпляры этих типов без синхронизации. [106] [107] Таким образом, вместо поддержки языка безопасное параллельное программирование опирается на соглашения; например, Чисналл рекомендует идиому под названием «псевдонимы xor mutable», означающую, что передача изменяемого значения (или указателя) по каналу сигнализирует о передаче права собственности на значение его получателю. [93] : 155  В цепочке инструментов gc есть дополнительный детектор гонки данных, который может проверять несинхронизированный доступ к общей памяти во время выполнения, начиная с версии 1.1, [108] кроме того, детектор гонки «лучшее усилие» также включен по умолчанию, начиная с версии 1.6 среды выполнения gc для доступа к mapтипу данных. [109]

Двоичные файлы

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

Упущения

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

Из пропущенных языковых возможностей разработчики явно выступают против утверждений и арифметики указателей, защищая при этом выбор пропустить наследование типов как дающий более полезный язык, поощряя вместо этого использование интерфейсов для достижения динамической диспетчеризации [h] и композиции для повторного использования кода. Композиция и делегирование фактически в значительной степени автоматизированы с помощью встраивания структур ; по словам исследователей Шмагера и др. , эта функция «имеет много недостатков наследования: она влияет на открытый интерфейс объектов, она не является мелкозернистой (т. е. нет контроля на уровне методов над встраиванием), методы встраиваемых объектов не могут быть скрыты, и она статична», что делает «неочевидным», будут ли программисты злоупотреблять ею в той степени, в которой программисты на других языках, как известно, злоупотребляют наследованием. [70]

Обработка исключений изначально была опущена в Go из-за отсутствия «дизайна, который дает значение, пропорциональное сложности». [115] Механизм паники / восстановления , подобный исключению , который избегает обычной структуры управления, был предложен [116] и выпущен в снимке 30 марта 2010 года. [117] Авторы Go советуют использовать его для неустранимых ошибок, таких как те, которые должны остановить всю программу или запрос сервера, или в качестве сокращения для распространения ошибок вверх по стеку внутри пакета. [118] [119] За пределами границ пакета Go включает канонический тип ошибки, и возврат нескольких значений с использованием этого типа является стандартной идиомой. [4]try-catch

Стиль

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

Инструменты

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

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

Еще один инструмент, поддерживаемый командой Go, но не включенный в дистрибутивы Go gopls, — это языковой сервер, который предоставляет такие функции IDE , как интеллектуальное завершение кода для редакторов, совместимых с протоколом языкового сервера . [128]

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

Примеры

Привет, мир

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

где "fmt" - это пакет для форматированного ввода-вывода , аналогичный файлу ввода-вывода C в языке C. [129]

Параллелизм

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

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

Тестирование

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

func ExtractUsername ( email string ) string { at := strings.Index ( email , " @" ) return email [ : at ] }        

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

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

Возможно параллельное проведение тестов.

Веб-приложение

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

В этом примере при посещении localhost:8080 будет отображаться сообщение «Hello world!».

основной пакет импорт ( "fmt" "log" "net/http" )    func helloFunc ( w http.ResponseWriter , r * http.Request ) { fmt.Fprintf ( w , " Привет , мир ! " ) }       func main ( ) { http.HandleFunc ( "/ " , helloFunc ) log.Fatal ( http.ListenAndServe ( " : 8080 " , nil ) ) }      

Приложения

Go нашел широкое применение в различных областях благодаря своей надежной стандартной библиотеке и простоте использования. [131]

Популярные приложения включают в себя: Caddy , веб-сервер, который автоматизирует процесс настройки HTTPS, [132] Docker , который предоставляет платформу для контейнеризации, направленную на упрощение сложностей разработки и развертывания программного обеспечения, [133] Kubernetes , который автоматизирует развертывание, масштабирование и управление контейнеризированными приложениями, [134] CockroachDB , распределенную базу данных SQL, разработанную для масштабируемости и строгой согласованности, [135] и Hugo , статический генератор сайтов, который отдает приоритет скорости и гибкости, позволяя разработчикам эффективно создавать веб-сайты. [136]

Прием

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

Дэйв Астелс из Engine Yard написал в 2009 году: [138]

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

Go был назван языком программирования года индексом сообщества программирования TIOBE в свой первый год, 2009, за больший 12-месячный рост популярности (всего за 2 месяца после его введения в ноябре), чем любой другой язык в том году, и достиг 13-го места к январю 2010 года, [139] превзойдя такие устоявшиеся языки, как Pascal . К июню 2015 года его рейтинг упал ниже 50-го места в индексе, поместив его ниже COBOL и Fortran . [140] Но по состоянию на январь 2017 года его рейтинг резко вырос до 13-го места, что указывает на значительный рост популярности и принятия. Go снова был удостоен награды TIOBE Programming Language of the Year в 2016 году. [141]

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

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

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

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

—  Р. Хундт [143]

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

Спор об имени

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

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

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

Смотрите также

Примечания

  1. ^ Но «Чтобы сложные операторы могли занимать одну строку, точку с запятой можно опустить перед закрывающими скобками ) или }». [54]
  2. ^ "если новая строка следует за токеном, который может закончить оператор, [лексер] вставит точку с запятой". [55]
  3. ^ Обычно ровно одно из значений результата и ошибки имеет значение, отличное от нулевого значения типа; иногда оба имеют значение, например, когда чтение или запись могут быть выполнены только частично, а иногда ни одно из них, например, когда чтение возвращает 0 байт. См. Проблема полупредиката: Многозначный возврат .
  4. ^ ab Язык FAQ "Почему нет арифметики указателей? Безопасность ... никогда не выводите недопустимый адрес, который завершается неправильно ... использование индексов массива может быть таким же эффективным, как ... арифметика указателей ... упростите реализацию сборщика мусора..." [4]
  5. ^ FAQ по языку «Почему в Go нет утверждений? ...наш опыт показывает, что программисты используют их как опору, чтобы не думать о правильной обработке ошибок и сообщении об ошибках...» [4]
  6. ^ FAQ по языку «Почему нет немаркированных объединений...? [они] нарушат гарантии безопасности памяти Go». [4]
  7. ^ FAQ по языку «Почему в Go нет типов вариантов? ... Мы рассматривали [их, но] они перекрываются с интерфейсами запутанным образом.... [Не]которые из того, к чему обращаются типы вариантов, уже охвачены, ... хотя и не так элегантно». [4] (Тег типа интерфейса [112] доступен с помощью утверждения типа [113] ).
  8. ^ Вопросы «Как мне получить динамическую диспетчеризацию методов?» и «Почему нет наследования типов?» в FAQ по языку. [4]

Ссылки

  1. ^ "Codewalk: First-Class Functions in Go". Go поддерживает функции первого класса, функции высшего порядка, определяемые пользователем типы функций, литералы функций, замыкания и множественные возвращаемые значения. Этот богатый набор функций поддерживает функциональный стиль программирования на строго типизированном языке.
  2. ^ "Является ли Go объектно-ориентированным языком?" . Получено 13 апреля 2019 г. Хотя Go имеет типы и методы и допускает объектно-ориентированный стиль программирования, иерархии типов нет.
  3. ^ "Go: код, который растёт с изяществом" . Получено 24 июня 2018 г. Go является объектно-ориентированным, но не в обычном смысле.
  4. ^ abcdefgh "Часто задаваемые вопросы по проектированию языка". Язык программирования Go . 16 января 2010 г. Получено 27 февраля 2010 г.
  5. ^ ab "Текстовый файл ЛИЦЕНЗИЯ". Язык программирования Go . Получено 5 октября 2012 г.
  6. ^ «Спецификация языка программирования Go — язык программирования Go».
  7. ^ ab "Почему в Go нет объявлений "implements"?". Язык программирования Go . Получено 1 октября 2015 г.
  8. ^ Пайк, Роб (22 декабря 2014 г.). "Роб Пайк в Twitter". Архивировано из оригинала 7 апреля 2022 г. . Получено 13 марта 2016 г. В Go используется структурная типизация, а не утиная типизация. Полное соответствие интерфейсу проверяется и требуется.
  9. ^ "lang/go: go-1.4". Порты OpenBSD . 23 декабря 2014 г. Получено 19 января 2015 г.
  10. ^ "Go Porting Efforts". Ресурсы языка Go . cat-v. 12 января 2010 г. Получено 18 января 2010 г.
  11. ^ "Дополнительное предоставление прав интеллектуальной собственности". Язык программирования Go . Получено 5 октября 2012 г.
  12. ^ Кинкейд, Джейсон (10 ноября 2009 г.). «Go от Google: новый язык программирования, сочетающий Python и C++». TechCrunch . Получено 18 января 2010 г.
  13. ^ Метц, Кейд (5 мая 2011 г.). «Google Go смело идет туда, куда еще не ступала нога кодера». The Register .
  14. ^ "Язык называется Go или Golang?" . Получено 16 марта 2022 г. Язык называется Go.
  15. ^ "Go 1.5 Release Notes" . Получено 28 января 2016 г. Компилятор и среда выполнения теперь реализованы на Go и ассемблере, без C.
  16. ^ "Язык программирования Go" . Получено 1 ноября 2024 г. .
  17. ^ "gofrontend" . Получено 1 ноября 2024 г. .
  18. ^ "gccgo" . Получено 1 ноября 2024 г. . gccgo, компилятор GNU для языка программирования Go
  19. ^ "Gollvm" . Получено 1 ноября 2024 г. Gollvm — это компилятор Go на основе LLVM.
  20. ^ "Компилятор из Go в JavaScript для запуска кода Go в браузере: Gopherjs/Gopherjs". GitHub . Архивировано из оригинала 12 декабря 2023 г.
  21. ^ "Go at Google: Language Design in the Service of Software Engineering" . Получено 8 октября 2018 г.
  22. Пайк, Роб (28 апреля 2010 г.). «Еще один шаг в разработке языка». Коллоквиум по компьютерным системам Стэнфордского университета . Стэнфордский университет .Видео доступно.
  23. ^ "Часто задаваемые вопросы (FAQ) - Язык программирования Go". Язык программирования Go . Получено 26 февраля 2016 г. .
  24. Бинсток, Эндрю (18 мая 2011 г.). «Доктор Доббс: Интервью с Кеном Томпсоном». Архивировано из оригинала 5 января 2013 г. Получено 7 февраля 2014 г.
  25. ^ Пайк, Роб (2012). «Меньше — значит экспоненциально больше».
  26. ^ Гриземер, Роберт (2015). «Эволюция го».
  27. ^ Гриземер, Роберт; Пайк, Роб; Томпсон, Кен; Тейлор, Ян; Кокс, Расс; Ким, Джини; Лэнгли, Адам. "Hey! Ho! Let's Go!". Google Open Source . Получено 17 мая 2018 г.
  28. ^ Шенкленд, Стивен (30 марта 2012 г.). «Языку Go от Google исполнился год, он занял место на YouTube: язык программирования низкого уровня достаточно созрел, чтобы носить номер версии 1.0. И он используется в реальной работе в Google». Новости. CNet . CBS Interactive Inc . Получено 6 августа 2017 г. Google выпустила версию 1 своего языка программирования Go, амбициозную попытку превзойти гигантов мира программирования низкого уровня, таких как C и C++.
  29. ^ "История релизов". Язык программирования Go .
  30. ^ "Go FAQ: использует ли Google Go внутри компании?" . Получено 9 марта 2013 г.
  31. ^ "Go Gopher - язык программирования Go". go.dev . Получено 9 февраля 2023 г. .
  32. ^ "Go fonts". Go. 16 ноября 2016 г. Получено 12 марта 2019 г.
  33. ^ "Go Font TTFs". GitHub . Получено 2 апреля 2019 г.
  34. ^ "Go's New Brand". The Go Blog . Получено 9 ноября 2018 г.
  35. ^ Меррик, Элис (9 марта 2021 г.). «Результаты опроса разработчиков Go 2020». Язык программирования Go . Получено 16 марта 2022 г.
  36. ^ ab Pike, Rob (26 сентября 2013 г.). "Массивы, срезы (и строки): механика 'append'". The Go Blog . Получено 7 марта 2015 г. .
  37. ^ «E2E: Эрик Мейер и Роберт Гриземер». Канал 9 . Майкрософт. 7 мая 2012 г.
  38. ^ "Go 2 Draft Designs" . Получено 12 сентября 2018 г. .
  39. ^ "Блог Go: проекты Go 2". 28 августа 2018 г.
  40. ^ "Предложение: встроенная функция проверки ошибок Go, "try"". Репозиторий Go на GitHub . Получено 16 марта 2022 г.
  41. ^ «Параметры типа — Проект проекта». go.googlesource.com .
  42. ^ "Дженериксы в Go". bitfieldconsulting.com . 17 декабря 2021 г.
  43. ^ "Go 1.18 выпущен!". Язык программирования Go . 15 марта 2022 г. Получено 16 марта 2022 г.
  44. ^ "Go 1 и будущее программ Go". Язык программирования Go .
  45. ^ "Go 1.23 Release Notes". Язык программирования Go .
  46. ^ "История релизов". Язык программирования Go .
  47. ^ "Обратная совместимость, Go 1.21 и Go 2". Язык программирования Go .
  48. ^ "Краткое руководство по ассемблеру Go". go.dev . Получено 31 декабря 2021 г. .
  49. ^ Пайк, Роб. "Язык программирования Go". YouTube . Получено 1 июля 2011 г.
  50. Пайк, Роб (10 ноября 2009 г.). Язык программирования Go (flv) (технический доклад). Google. Событие происходит в 8:53.
  51. ^ «Загрузить и установить пакеты и зависимости».Адреса и документацию некоторых пакетов можно найти на сайте godoc.org.
  52. ^ "GoDoc". godoc.org .
  53. Пайк, Роб. "The Changelog" (Подкаст). Архивировано из оригинала 20 октября 2013 г. Получено 7 октября 2013 г.
  54. ^ "Спецификация языка программирования Go, §Точки с запятой". Язык программирования Go .
  55. ^ "Эффективный Go, §Точки с запятой". Язык программирования Go .
  56. ^ "Спецификация языка программирования Go". Язык программирования Go .
  57. Пайк, Роб (23 октября 2013 г.). «Строки, байты, руны и символы в Go».
  58. ^ Докси, Кейлеб. «Структуры и интерфейсы — Введение в программирование на Go». www.golang-book.com . Получено 15 октября 2018 г. .
  59. ^ Джерранд, Эндрю. «Go Slices: использование и внутреннее устройство».
  60. ^ Авторы Go. «Эффективное Go: Срезы».
  61. ^ Авторы Go. «Селекторы».
  62. ^ Авторы Go. «Звонки».
  63. ^ "Спецификация языка программирования Go, §Пакет небезопасен". Язык программирования Go .
  64. ^ "Спецификация языка программирования Go". go.dev . Получено 31 декабря 2021 г. .
  65. ^ "Спецификация языка программирования Go". Язык программирования Go .
  66. ^ "Экскурсия по го". go.dev .
  67. ^ "Спецификация языка программирования Go". Язык программирования Go .
  68. ^ "Спецификация языка программирования Go". go.dev . Получено 31 декабря 2021 г. .
  69. ^ "Спецификация языка программирования Go". Язык программирования Go .
  70. ^ ab Шмагер, Фрэнк; Кэмерон, Николас; Нобл, Джеймс (2010). GoHotDraw: оценка языка программирования Go с помощью шаблонов проектирования . Оценка и удобство использования языков и инструментов программирования. ACM.
  71. ^ abcde Балберт, Иво (2012). Путь к Go: Полное введение в язык программирования Go . iUniverse.
  72. ^ "Эволюция Go". talks.golang.org . Получено 13 марта 2016 г. .
  73. ^ Диггинс, Кристофер (24 ноября 2009 г.). «Утиная типизация и язык программирования Go». Доктор Доббс, Мир разработки программного обеспечения . Получено 10 марта 2016 г.
  74. Райер, Мэт (1 декабря 2015 г.). «Утиная печать в Go» . Получено 10 марта 2016 г.
  75. ^ "Часто задаваемые вопросы (FAQ) - Язык программирования Go". Язык программирования Go .
  76. ^ "Спецификация языка программирования Go". Язык программирования Go .
  77. ^ "Спецификация языка программирования Go". Язык программирования Go .
  78. ^ "отражающий пакет". pkg.go.dev .
  79. ^ "map[string]interface{} in Go". bitfieldconsulting.com . 6 июня 2020 г.
  80. ^ "Go Data Structures: Interfaces" . Получено 15 ноября 2012 г. .
  81. ^ "Спецификация языка программирования Go". Язык программирования Go .
  82. ^ "Go 1.18 Release Notes: Generics". Язык программирования Go . 15 марта 2022 г. Получено 16 марта 2022 г.
  83. ^ "Предложение параметров типа". go.googlesource.com . Получено 25 июня 2023 г. .
  84. ^ "Спецификация языка программирования Go - Язык программирования Go". go.dev . Получено 25 июня 2023 г. .
  85. ^ "Введение в дженерики - язык программирования Go". go.dev . Получено 25 июня 2023 г. .
  86. ^ "Предложение параметров типа". go.googlesource.com . Получено 25 июня 2023 г. .
  87. ^ "Effective Go". golang.org . Авторы Go . Получено 13 мая 2014 г. .
  88. ^ "Учебник по языку программирования Go". Язык программирования Go . Получено 10 марта 2013 г. В Go правило о видимости информации простое: если имя (типа верхнего уровня, функции, метода, константы или переменной, поля структуры или метода) написано с заглавной буквы, пользователи пакета могут его увидеть. В противном случае имя и, следовательно, именуемая вещь видны только внутри пакета, в котором они объявлены.
  89. ^ "go". Язык программирования Go .
  90. ^ "Как писать код Go". Язык программирования Go . Пакетам из стандартной библиотеки даны короткие пути импорта, такие как "fmt" и "net/http". Для ваших собственных пакетов вы должны выбрать базовый путь, который вряд ли будет конфликтовать с будущими дополнениями к стандартной библиотеке или другим внешним библиотекам. Если вы храните свой код в исходном репозитории где-то, то вы должны использовать корень этого исходного репозитория в качестве базового пути. Например, если у вас есть учетная запись Example на example.com/user, это должен быть ваш базовый путь
  91. ^ ab Пайк, Роб (18 сентября 2012 г.). «Параллелизм — это не параллелизм».
  92. ^ ab Донован, Алан AA; Керниган, Брайан В. (2016). Язык программирования Go . Серия профессиональных вычислений Addison-Wesley. Нью-Йорк, Мюнхен: Addison-Wesley. ISBN 978-0-13-419044-0.
  93. ^ abcde Chisnall, Дэвид (2012). Разговорник языка программирования Go. Addison-Wesley. ISBN 9780132919005.
  94. ^ "Эффективный Go". Язык программирования Go .
  95. ^ Саммерфилд, Марк (2012). Программирование на Go: создание приложений для 21-го века . Эддисон-Уэсли.
  96. ^ "The Go Memory Model" . Получено 10 апреля 2017 г. .
  97. ^ "Шаблоны параллелизма Go". Язык программирования Go .
  98. Грэм-Камминг, Джон (24 августа 2013 г.). «Переработка буферов памяти в Go».
  99. ^ "дерево.иди".
  100. ^ Чеслак-Постава, Эвен. «Итераторы в Go».
  101. ^ Керниган, Брайан У. «Нисхождение в Лимб».
  102. ^ ab "The Go Memory Model" . Получено 5 января 2011 г. .
  103. ^ Тан, Пэйи (2010). Многоядерное параллельное программирование в Go (PDF) . Proc. Первая международная конференция по передовым вычислениям и коммуникациям. Архивировано из оригинала (PDF) 9 сентября 2016 г. Получено 14 мая 2015 г.
  104. ^ Нанз, Себастьян; Уэст, Скотт; Соареш да Силвейра, Кауэ. Исследование экспертного разрыва в параллельном программировании (PDF) . Euro-Par 2013. CiteSeerX 10.1.1.368.6137 . 
  105. ^ Go Authors. «Поделитесь памятью, общаясь».
  106. Кокс, Расс . «Вперед, на скачки».
  107. Пайк, Роб (25 октября 2012 г.). «Идите в Google: разработка языка на службе разработки программного обеспечения». Google, Inc.«Есть одно важное предостережение: Go не является полностью безопасным в плане памяти при наличии параллелизма».
  108. ^ "Представляем Go Race Detector". The Go Blog . Получено 26 июня 2013 г.
  109. ^ "Go 1.6 Release Notes - The Go Programming Language". go.dev . Получено 17 ноября 2023 г. .
  110. ^ «Часто задаваемые вопросы (FAQ) — язык программирования Go».
  111. ^ «История одного толстого го-бина». 21 сентября 2018 г.
  112. ^ "Спецификация языка программирования Go, §Типы интерфейсов". Язык программирования Go .
  113. ^ "Спецификация языка программирования Go, §Утверждения типов". Язык программирования Go .
  114. ^ "All Systems Are Go". informIT (Интервью). 17 августа 2010 г. Получено 21 июня 2018 г.
  115. ^ "Часто задаваемые вопросы о языковом дизайне". 13 ноября 2009 г. Архивировано из оригинала 13 ноября 2009 г.
  116. ^ "Предложение по механизму, подобному исключению". golang-nuts . 25 марта 2010 г. Получено 25 марта 2010 г.
  117. ^ "Еженедельная история снимков". Язык программирования Go .
  118. ^ "Panic And Recover". Перейти на wiki.
  119. ^ "Эффективный Go". Язык программирования Go .
  120. ^ "gofmt". Язык программирования Go . Получено 5 февраля 2021 г.
  121. ^ "golang/lint public archive". github.com . 30 ноября 2022 г.
  122. ^ ab "Эффективный Go". Язык программирования Go .
  123. ^ "Неиспользуемые локальные переменные". yourbasic.org . Получено 11 февраля 2021 г. .
  124. ^ "Неиспользуемые импорты пакетов". yourbasic.org . Получено 11 февраля 2021 г. .
  125. ^ "Комментарии к обзору кода". GitHub . Получено 3 июля 2018 г.
  126. ^ "Talks" . Получено 3 июля 2018 г. .
  127. ^ "Errors Are Values" . Получено 3 июля 2018 г. .
  128. ^ "tools/gopls/README.md в master · golang/tools". GitHub . Получено 17 ноября 2023 г. .
  129. ^ "fmt". Язык программирования Go . Получено 8 апреля 2019 г.
  130. ^ "тестирование". Язык программирования Go . Получено 27 декабря 2020 г.
  131. ^ Ли, Вэй-Мэн (24 ноября 2022 г.). «Введение в язык программирования Go». Component Developer Magazine . Архивировано из оригинала 5 июня 2023 г. Получено 8 сентября 2023 г.
  132. ^ Хоффманн, Фрэнк; Ноймейер, Мэнди (август 2018 г.). «Simply Secure». Linux Magazine . № 213. Архивировано из оригинала 28 мая 2023 г. Получено 8 сентября 2023 г.
  133. ^ Ли, Вэй-Мэн (31 августа 2022 г.). «Введение в контейнеризацию с использованием Docker». Журнал CODE . Архивировано из оригинала 30 мая 2023 г. Получено 8 сентября 2023 г.
  134. ^ Pirker, Alexander (24 февраля 2023 г.). «Безопасность Kubernetes для начинающих». Журнал CODE . Архивировано из оригинала 1 апреля 2023 г. Получено 8 сентября 2023 г.
  135. ^ Тафт, Ребекка; Шариф, Ирфан; Матей, Андрей; Ван Беншотен, Натан; Льюис, Джордан; Григер, Тобиас; Ниеми, Кай; Вудс, Энди; Бирзин, Энн; Посс, Рафаэль; Бардеа, Пол; Ранаде, Амрута; Дарнелл, Бен; Грюнейр, Брэм; ​​Джаффрей, Джастин; Чжан, Люси; Мэттис, Питер (11 июня 2020 г.). «CockroachDB: устойчивая геораспределенная база данных SQL». Труды Международной конференции ACM SIGMOD по управлению данными 2020 г. SIGMOD '20 . стр. 1493–1509. doi : 10.1145/3318464.3386134 . ISBN 978-1-4503-6735-6.
  136. ^ Хопкинс, Брэндон (13 сентября 2022 г.). «Создание статического сайта с Хьюго». Linux Journal . Архивировано из оригинала 8 апреля 2023 г. Получено 8 сентября 2023 г.
  137. ^ Симионато, Микеле (15 ноября 2009 г.). «Интерфейсы против наследования (или, берегитесь Go!)». artima . Получено 15 ноября 2009 г. .
  138. Астелс, Дэйв (9 ноября 2009 г.). «Ready, Set, Go!». engineyard. Архивировано из оригинала 19 октября 2018 г. Получено 9 ноября 2009 г.
  139. ^ jt (11 января 2010 г.). "Go от Google получил награду "Язык программирования года"". jaxenter . Получено 5 декабря 2012 г.
  140. ^ "Индекс сообщества программистов TIOBE за июнь 2015 г.". TIOBE Software. Июнь 2015 г. Получено 5 июля 2015 г.
  141. ^ "TIOBE Index". TIOBE . Получено 15 июля 2024 г. .
  142. ^ Eckel, Bruce (27 августа 2011 г.). "Вызов Go из Python через JSON-RPC" . Получено 29 августа 2011 г.
  143. ^ Хундт, Роберт (2011). Распознавание циклов в C++/Java/Go/Scala (PDF) . Scala Days.
  144. ^ Метц, Кейд (1 июля 2011 г.). «Google Go наносит ответный удар с помощью C++ bake-off». The Register .
  145. ^ Ягер, Уилл. "Почему Go нехорошо" . Получено 4 ноября 2018 г.
  146. ^ Добронски, Янош. "Повседневные неприятности в Го" . Получено 4 ноября 2018 г.
  147. ^ "Почему есть фигурные скобки, но нет точек с запятой? И почему я не могу поставить открывающую фигурную скобку на следующей строке?" . Получено 26 марта 2020 г. . Преимущества единого, программно предписанного формата для всех программ Go значительно перевешивают любые предполагаемые недостатки конкретного стиля.
  148. ^ "Я хочу покинуть Wild Ride мистера Голанга". 28 февраля 2020 г. Получено 17 ноября 2020 г.
  149. ^ "предложение: os: Create/Open/OpenFile() set FILE_SHARE_DELETE on windows #32088". GitHub . 16 мая 2019 г. . Получено 17 ноября 2020 г. .
  150. ^ Ту, Тенгфей (2019). "Понимание реальных ошибок параллелизма в Go" (PDF) . Например, около 58% ошибок блокировки вызваны передачей сообщений. Помимо нарушения правил использования каналов Go (например, ожидание на канале, на который никто не отправляет данные или который не закрывается), многие ошибки параллелизма вызваны смешанным использованием передачи сообщений и других новых семантик и новых библиотек в Go, которые можно легко пропустить, но трудно обнаружить.
  151. ^ Браунли, Джон (13 ноября 2009 г.). «Google не искал «Go» перед тем, как назвать свой язык программирования». Архивировано из оригинала 8 декабря 2015 г. Получено 26 мая 2016 г.
  152. ^ Claburn, Thomas (11 ноября 2009 г.). «Название Google 'Go' вызывает обвинения во зле». InformationWeek. Архивировано из оригинала 22 июля 2010 г. Получено 18 января 2010 г.
  153. ^ ab "Выпуск 9 - вперед — Я уже использовал название для *МОЕГО* языка программирования". Github . Google Inc. Получено 12 октября 2010 г. .

Дальнейшее чтение

Внешние ссылки