Го (язык программирования)
Парадигма | Мультипарадигма : одновременный императив , функционал. [1] объектно-ориентированный [2] [3] |
---|---|
Разработано | Роберт Гриземер Роб Пайк Кен Томпсон [4] |
Разработчик | Авторы Go [5] |
Впервые появился | 10 ноября 2009 г |
Стабильная версия | 1.22.4
/ 4 июня 2024 г |
Дисциплина набора текста | Предполагаемый , статичный , сильный , [6] структурный , [7] [8] номинальный |
Управление памятью | Сбор мусора |
Язык реализации | Go, язык Ассемблера (gc); C++ (гофронтенд) |
ТЫ | DragonFly BSD , FreeBSD , Linux , macOS , NetBSD , OpenBSD , [9] План 9 , [10] Солярис , Винда |
Лицензия | 3-пунктовый BSD [5] + патента выдача [11] |
Расширения имен файлов | .идти |
Веб-сайт | идти |
Основные реализации | |
GC, GoFrontend | |
Под влиянием | |
C , Оберон-2 , Лимбо , Активный Оберон , взаимодействие последовательных процессов , Паскаль , Оберон , Smalltalk , Newsqueak , Modula-2 , Alef , APL , BCPL , Modula , occam | |
Под влиянием | |
Кристалл , В. |
Go — статически типизированный , компилируемый высокого уровня, язык программирования разработанный в Google. [12] , Роберт Гриземер Роб Пайк и Кен Томпсон . [4] он Синтаксически похож на C , но также имеет безопасность памяти , сборку мусора , структурную типизацию . [7] и CSP в стиле параллелизм . [13] Его часто называют Golang из-за его прежнего доменного имени: golang.org
, но его собственное имя — Го. [14]
Существует две основные реализации:
- Google Самостоятельный хостинг [15] «gc» компилятора Набор инструментов , ориентированный на несколько операционных систем и WebAssembly . [16]
- gofrontend — интерфейс для других компиляторов с библиотекой libgo . Для GCC используется комбинация gccgo; [17] с LLVM комбинация — gollvm. [18] [а]
Сторонний компилятор исходного кода GopherJS, [20] компилирует Перейти к JavaScript для веб-разработки внешнего интерфейса .
История
[ редактировать ]Go был разработан в Google 2007 году для повышения производительности программирования в эпоху многоядерных сетевых в машин и больших баз кода . [21] Дизайнеры хотели ответить на критику других языков, используемых в Google, но сохранить их полезные характеристики: [22]
- Статическая типизация и эффективность выполнения (например, C )
- Читабельность и удобство использования (как Python ) [23]
- Высокопроизводительная сеть и многопроцессорная обработка
Его дизайнеры в первую очередь руководствовались общей неприязнью к C++ . [24] [25] [26]
Go был публично анонсирован в ноябре 2009 года. [27] а версия 1.0 была выпущена в марте 2012 года. [28] [29] Go широко используется в производстве в Google [30] и во многих других организациях и проектах с открытым исходным кодом.
Брендинг и стиль
[ редактировать ]Талисман Суслика был представлен в 2009 году для с открытым исходным кодом запуска языка . Дизайн Рене Френч позаимствован у ок. 2000 года Продвижение WFMU . [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] )
Дженерики
[ редактировать ]Отсутствие поддержки общего программирования в первоначальных версиях 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.22. [45] сдержали это обещание.
Go не следует за SemVer ; скорее, каждая основная версия Go поддерживается до тех пор, пока не появятся две новые второстепенные версии. В отличие от большинства программ, Go называет второе число в версии основным, т. е. в 1.x
x
это основная версия. [46] Это связано с тем, что Go планирует никогда не достичь версии 2.0, учитывая, что совместимость является одним из основных преимуществ языка. [47]
Дизайн
[ редактировать ]Go находится под влиянием C (особенно Plan 9) . диалекта [48] [ не удалось пройти проверку – см. обсуждение ] ), но с упором на большую простоту и безопасность. Он состоит из:
- Синтаксис и среда, использующие шаблоны, более распространенные в динамических языках : [49]
- Необязательное краткое объявление переменной и инициализация посредством вывода типа (
x := 0
вместоvar x int = 0;
илиvar x = 0;
) - Быстрая компиляция [50]
- Удаленное управление пакетами (
go get
) [51] и онлайн-документация пакета [52]
- Необязательное краткое объявление переменной и инициализация посредством вывода типа (
- Отличительные подходы к конкретным проблемам:
- Встроенные примитивы параллелизма: легкие процессы (горутины), каналы и
select
заявление - Система интерфейсов вместо виртуального наследования и внедрение типов вместо невиртуального наследования.
- Инструментальная цепочка, которая по умолчанию создает статически связанные собственные двоичные файлы без внешних зависимостей Go.
- Встроенные примитивы параллелизма: легкие процессы (горутины), каналы и
- Желание сохранить спецификацию языка достаточно простой, чтобы ее можно было держать в голове программиста, [53] отчасти за счет исключения функций, общих для подобных языков .
Синтаксис
[ редактировать ]Синтаксис Go включает изменения по сравнению с C, направленные на то, чтобы сделать код кратким и читаемым. Был введен комбинированный оператор объявления/инициализации, который позволяет программисту писать i := 3
или s := "Hello, world!"
, без указания типов используемых переменных. Это контрастирует с C int i = 3;
и const char *s = "Hello, world!";
.
Точки с запятой по-прежнему завершают операторы; [б] но они неявны, когда происходит конец строки. [с]
Методы могут возвращать несколько значений и возвращать result, err
Пара — это традиционный способ, которым метод сообщает об ошибке вызывающему объекту в Go. [д] Go добавляет литеральный синтаксис для инициализации параметров структуры по имени, а также для инициализации карт и срезов . В качестве альтернативы трем операторам C for
петля, Го range
выражения позволяют выполнять краткую итерацию по массивам, срезам, строкам, картам и каналам. [56]
Типы
[ редактировать ]Go имеет ряд встроенных типов, включая числовые ( байт , int64 , float32 и т. д.), логические значения и байтовые строки ( нить ). Строки неизменяемы; встроенные операторы и ключевые слова (а не функции) обеспечивают конкатенацию, сравнение и UTF-8 . кодирование/декодирование [57] Типы записей можно определить с помощью Ключевое слово структуры . [58]
Для каждого типа T и каждая неотрицательная целочисленная константа n существует тип массива , обозначаемый [ п ] Т ; Таким образом, массивы разной длины относятся к разным типам. Динамические массивы доступны в виде «срезов», обозначаемых [] T для некоторого типа Т. Они имеют длину и емкость , определяющие, когда необходимо выделить новую память для расширения массива. Несколько срезов могут совместно использовать свою базовую память. [36] [59] [60]
Указатели доступны для всех типов, а указатель на Тип Т обозначается * Т. Прием адреса и косвенность используют & и * операторы, как в C, или происходят неявно через синтаксис вызова метода или доступа к атрибуту. [61] [62] Нет никакой арифметики указателей, [и] кроме как через спец. unsafe.Тип указателя в стандартной библиотеке. [63]
Для пары типов К , В , тип map[ K ] V — тип отображения типов. K клавиш для ввода- Значения V , хотя спецификация языка программирования Go не дает никаких гарантий производительности или требований к реализации для типов карт. Хэш-таблицы встроены в язык со специальным синтаксисом и встроенными функциями. chan T — канал , позволяющий отправлять значения типа T между параллельными процессами Go . [64]
Помимо поддержки интерфейсов , система типов Go является номинальной : Ключевое слово type можно использовать для определения нового именованного типа , который отличается от других именованных типов, имеющих тот же макет (в случае struct , те же члены в том же порядке). Некоторые преобразования между типами (например, между различными целочисленными типами) предопределены, и добавление нового типа может определять дополнительные преобразования, но преобразования между именованными типами всегда должны вызываться явно. [65] Например, Ключевое слово type можно использовать для определения типа адресов IPv4 на основе 32-битных целых чисел без знака следующим образом:
type ipv4addr uint32
При таком определении типа ipv4addr(x) интерпретирует uint32 значение x в качестве IP-адреса. Просто назначая x в переменную типа ipv4addr — это ошибка типа. [66]
Константные выражения могут быть типизированными или «нетипизированными»; им присваивается тип при присвоении типизированной переменной, если значение, которое они представляют, проходит проверку во время компиляции. [67]
функций Типы обозначаются значком ключевое слово func ; они принимают ноль или более параметров и возвращают ноль или более значений, причем все они являются типизированными. Параметр и возвращаемые значения определяют тип функции; таким образом, func(string, int32) (int, error) — это тип функций, которые принимают строку и 32-битное целое число со знаком и вернуть целое число со знаком (ширины по умолчанию) и значение встроенного типа интерфейса. ошибка . [68]
С любым именованным типом методов связан набор . Приведенный выше пример IP-адреса можно расширить с помощью метода проверки того, соответствует ли его значение известному стандарту:
// ZeroBroadcast reports whether addr is 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. Определение типа Т не обязательно (и не может) идентифицировать тип I. Например, если Форма , Квадрат и Круг определяются как
import "math"
type Shape interface {
Area() float64
}
type Square struct { // Note: no "implements" declaration
side float64
}
func (sq Square) Area() float64 { return sq.side * sq.side }
type Circle struct { // No "implements" declaration here either
radius float64
}
func (c Circle) Area() float64 { return math.Pi * math.Pow(c.radius, 2) }
тогда оба Площадь и Круг неявно Форма и может быть назначена Shape . Переменная типа [71] : 263–268 Говоря формальным языком, система интерфейса Go обеспечивает структурную, а не номинальную типизацию. Интерфейсы могут встраивать другие интерфейсы, создавая комбинированный интерфейс, который удовлетворяет именно тем типам, которые реализуют встроенный интерфейс, и любым методам, которые добавляет новый определенный интерфейс. [71] : 270
Стандартная библиотека Go использует интерфейсы для обеспечения универсальности в нескольких местах, включая систему ввода/вывода, основанную на концепциях Читатель и Писатель . [71] : 282–283
Помимо вызова методов через интерфейсы, Go позволяет преобразовывать значения интерфейса в другие типы с проверкой типов во время выполнения. Языковые конструкции, позволяющие сделать это, — это утверждение типа , [76] который проверяет один потенциальный тип:
var shp Shape = Square{5}
square, ok := shp.(Square) // Asserts Square type on shp, should work
if ok {
fmt.Printf("%#v\n", square)
} else {
fmt.Println("Can't print shape as Square")
}
и переключатель типа , [77] который проверяет несколько типов: [ нужна ссылка ]
func (sq Square) Diagonal() float64 { return sq.side * math.Sqrt2 }
func (c Circle) Diameter() float64 { return 2 * c.radius }
func LongestContainedLine(shp Shape) float64 {
switch v := shp.(type) {
case Square:
return v.Diagonal() // Or, with type assertion, shp.(Square).Diagonal()
case Circle:
return v.Diameter() // Or, with type assertion, shp.(Circle).Diameter()
default:
return 0 // In practice, this should be handled with errors
}
}
интерфейс Пустой interface{}
является важным базовым вариантом, поскольку он может относиться к элементу любого конкретного типа. Это похоже на Класс объекта в Java или C# , которому удовлетворяет любой тип, включая встроенные типы, такие как инт . [71] : 284 Код, использующий пустой интерфейс, не может просто вызывать методы (или встроенные операторы) объекта, на который ссылается, но он может хранить interface{}
значение, попробуйте преобразовать его в более полезный тип с помощью утверждения типа или переключения типа или проверьте его с помощью Go reflect
упаковка. [78] Потому что interface{}
может ссылаться на любое значение, это ограниченный способ обойти ограничения статической типизации, например void*
в C, но с дополнительными проверками типов во время выполнения. [ нужна ссылка ]
The interface{}
Тип можно использовать для моделирования структурированных данных любой произвольной схемы в Go, например данных JSON или YAML , представляя их в виде map[string]interface{}
(сопоставление строки с пустым интерфейсом). Это рекурсивно описывает данные в виде словаря со строковыми ключами и значениями любого типа. [79]
Значения интерфейса реализуются с использованием указателя на данные и второго указателя на информацию о типе времени выполнения. [80] Как и некоторые другие типы, реализованные с использованием указателей в Go, значения интерфейса nil
если не инициализирован. [81]
Общий код с использованием параметризованных типов
[ редактировать ]Начиная с версии 1.18, Go поддерживает универсальный код с использованием параметризованных типов. [82]
Функции и типы теперь могут быть универсальными с использованием параметров типа. Эти параметры типа указываются в квадратных скобках сразу после имени функции или типа. [83] Компилятор преобразует универсальную функцию или тип в неуниверсальную, заменяя аргументы типа предоставленными параметрами типа либо явно пользователем, либо выводом типа компилятором. [84] Этот процесс преобразования называется созданием экземпляра типа. [85]
Интерфейсы теперь могут определять набор типов (известный как набор типов), используя |
(Объединение), а также набор методов. Эти изменения были внесены для поддержки ограничений типов в коде обобщений. Для универсальной функции или типа ограничение можно рассматривать как тип аргумента типа: метатип. Этот новый ~T
синтаксис будет первым использованием ~
как токен в Go. ~T
означает набор всех типов, базовым типом которых является T
. [86]
type Number interface {
~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] // Type instantiation
println(add(1, 2, 3, 4, 5)) // 15
res := Add(1.1, 2.2, 3.3, 4.4, 5.5) // Type Inference
println(res) // +1.650000e+001
}
Перечислимые типы
[ редактировать ]Go использует iota
ключевое слово для создания перечислимых констант. [87]
type ByteSize float64
const (
_ = iota // ignore first value by assigning to blank identifier
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/имя_пользователя/имя_пакета), чтобы уменьшить вероятность конфликта имен с будущими дополнениями к стандартной библиотеке или другим внешним библиотекам. [90]
Параллелизм: горутины и каналы
[ редактировать ]Язык Go имеет встроенные возможности, а также поддержку библиотек для написания параллельных программ . Параллелизм относится не только к параллелизму ЦП, но и к асинхронности : позволяет выполнять медленные операции, такие как чтение базы данных или сети, пока программа выполняет другую работу, как это часто бывает на серверах, основанных на событиях. [91]
Основной конструкцией параллелизма является горутина , тип зеленого потока . [92] : 280–281 Вызов функции с префиксом go
Ключевое слово запускает функцию в новой горутине. Спецификация языка не определяет, как должны быть реализованы горутины, но текущие реализации мультиплексируют горутины процесса Go в меньший набор потоков операционной системы , аналогично планированию, выполняемому в Erlang . [93] : 10
пакет стандартной библиотеки, включающий большинство классических структур управления параллелизмом ( блокировки мьютексов и т. д.), Несмотря на то, что доступен [93] : 151–152 вместо этого идиоматические параллельные программы предпочитают каналы , которые отправляют сообщения между горутинами. [94] Дополнительные буферы хранят сообщения в FIFO. порядке [95] : 43 и разрешить отправку горутин до получения их сообщений. [92] : 233
Каналы типизированы, поэтому канал типа chan T можно использовать только для передачи сообщений типа Т. Для работы с ними используется специальный синтаксис; <-ch — это выражение, которое заставляет выполняющуюся горутину блокироваться до тех пор, пока значение не поступит по каналу. ч , в то время как ch <- x отправляет значение x (возможно, блокировка до тех пор, пока другая горутина не получит значение). Встроенный переключатель - как оператор выбора может использоваться для реализации неблокирующей связи по нескольким каналам; см. ниже пример . В Go есть модель памяти, описывающая, как горутины должны использовать каналы или другие операции для безопасного обмена данными. [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 намеренно опускает некоторые функции, распространенные в других языках, включая наследование (реализации) , утверждения , [ф] арифметика указателей , [и] неявные преобразования типов , объединения без тегов , [г] и тегированные союзы . [час] Проектировщики добавили только те объекты, с которыми согласились все трое. [114]
Что касается пропущенных функций языка, дизайнеры явно выступают против утверждений и арифметики указателей, защищая при этом отказ от наследования типов как более полезный язык, поощряя вместо этого использование интерфейсов для достижения динамической диспетчеризации. [я] и композиция для повторного использования кода. Состав и делегирование фактически в значительной степени автоматизированы структуры встраивание ; по мнению исследователей Шмагера и др. , эта функция «имеет множество недостатков наследования: она влияет на общедоступный интерфейс объектов, она не является детальной (т. е. отсутствует контроль над внедрением на уровне метода), методы встроенных объектов не могут быть скрыты и она статична. ", что делает "неочевидным", будут ли программисты злоупотреблять им до такой степени, как программисты на других языках, как известно, злоупотребляют наследованием. [70]
Обработка исключений изначально была опущена в Go из-за отсутствия «дизайна, который дает ценность, пропорциональную сложности». [115] Исключение, похожее на паника / механизм восстановления , который позволяет избежать обычного try-catch
была предложена структура контроля [116] и выпущен на снимке от 30 марта 2010 г. [117] Авторы Go советуют использовать его для неисправимых ошибок, например тех, которые должны остановить всю программу или запрос к серверу, или в качестве ярлыка для распространения ошибок вверх по стеку внутри пакета. [118] [119] За пределами пакета Go включает канонический тип ошибки, и возвраты с несколькими значениями, использующие этот тип, являются стандартной идиомой. [4]
Стиль
[ редактировать ]Авторы Go приложили значительные усилия, чтобы повлиять на стиль программ Go:
- Отступы, интервалы и другие детали кода на поверхностном уровне автоматически стандартизируются
gofmt
инструмент. В нем используются табуляции для отступов и пробелы для выравнивания. Выравнивание предполагает, что редактор использует шрифт фиксированной ширины. [120]golint
автоматически выполняет дополнительные проверки стиля, но он устарел и заархивирован сопровождающими Go. [121] - Инструменты и библиотеки, распространяемые вместе с Go, предлагают стандартные подходы к таким вещам, как документация API (
godoc
), [122] тестирование (go test
), здание (go build
), управление пакетами (go get
), и так далее. - Go применяет правила, которые являются рекомендациями на других языках, например, запрещает циклические зависимости, неиспользуемые переменные. [123] или импорт, [124] и неявные преобразования типов.
- Отсутствие как определенных функций (например, ярлыков функционального программирования, таких
map
и в стиле Javatry
/finally
блоки) имеет тенденцию поощрять определенный явный, конкретный и императивный стиль программирования. - В первый день команда Го опубликовала сборник идиом Го. [122] а позже также собрал комментарии по проверке кода, [125] переговоры, [126] и официальные сообщения в блоге [127] преподавать стиль Go и философию кодирования.
Инструменты
[ редактировать ]В основной дистрибутив Go входят инструменты для сборки , тестирования и анализа кода:
go build
, который собирает двоичные файлы Go, используя только информацию из самих исходных файлов, без отдельных make-файлов.go test
, для модульного тестирования и микробенчмарков, а также фаззингаgo fmt
, для форматирования кодаgo install
, для получения и установки удаленных пакетовgo vet
, статический анализатор, ищущий потенциальные ошибки в кодеgo run
, ярлык для создания и выполнения кодаgodoc
, для отображения документации или ее обслуживания через HTTPgorename
, для переименования переменных, функций и т. д. типобезопасным способом.go generate
, стандартный способ вызова генераторов кодаgo mod
, для создания нового модуля, добавления зависимостей, обновления зависимостей и т. д.
Он также включает поддержку профилирования и отладки , возможности фаззинга для обнаружения ошибок, инструменты времени выполнения (например, для отслеживания пауз в сборе мусора ) и детектор гонок за данными .
Еще один инструмент, поддерживаемый командой Go, но не включенный в дистрибутивы Go, — gopls
, языковой сервер, который предоставляет такие функции IDE , как интеллектуальное завершение кода , для редакторов, совместимых с протоколом языкового сервера . [128]
К стандартному дистрибутиву добавляется экосистема сторонних инструментов, таких как gocode
, который обеспечивает автодополнение кода во многих текстовых редакторах, goimports
, который автоматически добавляет/удаляет импорт пакетов по мере необходимости и errcheck
, который обнаруживает код, который может непреднамеренно игнорировать ошибки.
Примеры
[ редактировать ]Привет, мир
[ редактировать ]package main
import "fmt"
func main() {
fmt.Println("hello world")
}
где «fmt» — это пакет для форматированного ввода-вывода , аналогичный входу/выводу файла C в C. [129]
Параллелизм
[ редактировать ]Следующая простая программа демонстрирует возможности параллелизма Go для реализации асинхронной программы. Он запускает два легких потока («го-рутины»): один ждет, пока пользователь наберет текст, а другой реализует тайм-аут. Оператор select ожидает, пока любая из этих горутин отправит сообщение основной подпрограмме, и действует в соответствии с первым поступившим сообщением (пример, адаптированный из книги Дэвида Чисналла). [93] : 152
package main
import (
"fmt"
"time"
)
func readword(ch chan string) {
fmt.Println("Type a word, then hit Enter.")
var word string
fmt.Scanf("%s", &word)
ch <- word
}
func timeout(t chan bool) {
time.Sleep(5 * time.Second)
t <- false
}
func main() {
t := make(chan bool)
go timeout(t)
ch := make(chan string)
go readword(ch)
select {
case word := <-ch:
fmt.Println("Received", word)
case <-t:
fmt.Println("Timeout.")
}
}
Тестирование
[ редактировать ]Пакет тестирования обеспечивает поддержку автоматического тестирования пакетов go. [130] Пример целевой функции:
func ExtractUsername(email string) string {
at := strings.Index(email, "@")
return email[:at]
}
Код теста (обратите внимание, что ключевое слово Assert отсутствует в Go; тесты находятся в <filename>_test.go в том же пакете):
import (
"testing"
)
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) {
username := ExtractUsername("[email protected]")
if username != "jonh.smith" {
t.Fatalf("Got: %v\n", username)
}
})
}
Возможно параллельное выполнение тестов.
Веб-приложение
[ редактировать ]Пакет net/http обеспечивает поддержку создания веб-приложений.
В этом примере будет показано «Привет, мир!» при посещении localhost:8080.
package main
import (
"fmt"
"log"
"net/http"
)
func helloFunc(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello world!")
}
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]
Прием
[ редактировать ]Система интерфейса и намеренное отсутствие наследования были высоко оценены Микеле Симионато, который сравнил эти характеристики с характеристиками Standard ML , назвав это «позором, что ни один популярный язык не пошел по [этому] конкретному пути». [137]
Дэйв Астелс из Engine Yard писал в 2009 году: [138]
В Go чрезвычайно легко погрузиться. Существует минимальное количество фундаментальных концепций языка, а синтаксис чистый, понятный и недвусмысленный. Go по-прежнему экспериментальный и немного грубоватый.
Go был назван языком программирования года по версии Индекса сообщества программистов TIOBE в первый, 2009 год, за более значительный рост популярности за 12 месяцев (всего за 2 месяца после его появления в ноябре), чем у любого другого языка в этом году. и к январю 2010 года достиг 13-го места, [139] превосходя признанные языки, такие как Паскаль . К июню 2015 года его рейтинг упал ниже 50-го места в индексе, что поставило его ниже, чем COBOL и Fortran . [140] Но по состоянию на январь 2017 года его рейтинг поднялся до 13-го места, что указывает на значительный рост популярности и принятия. Go снова был удостоен награды TIOBE «Язык программирования года» в 2016 году. [141]
Брюс Экель заявил: [142]
Сложность C++ (в новом C++ добавлена еще большая сложность) и, как следствие, влияние на производительность больше не оправданы. Все препятствия, через которые пришлось пройти программисту C++, чтобы использовать C-совместимый язык, больше не имеют смысла — это просто пустая трата времени и усилий. Go имеет гораздо больше смысла для класса задач, для решения которых изначально предназначался C++.
Оценка языка и его gc по сравнению с C++ ( GCC ), Java и Scala инженером Google обнаружил:
Go предлагает интересные возможности языка, которые также позволяют использовать краткие и стандартизированные обозначения. Компиляторы этого языка все еще незрелы, что отражается как на производительности, так и на размерах двоичных файлов.
— Р. Хундт [143]
Оценка получила опровержение со стороны команды разработчиков Go. Ян Лэнс Тейлор, который улучшил код Go для статьи Хундта, не знал о намерении опубликовать свой код и говорит, что его версия «никогда не предназначалась для того, чтобы быть примером идиоматического или эффективного Go»; Затем Расс Кокс оптимизировал код Go, а также код C++, и добился того, что код Go работал почти так же быстро, как версия C++, и более чем на порядок быстрее, чем код в статье. [144]
- в Go Ноль в сочетании с отсутствием алгебраических типов приводит к трудностям с обработкой ошибок и базовых случаев . [145] [146]
- Go не допускает появления открывающей скобки на отдельной строке, что заставляет всех программистов Go использовать один и тот же стиль скобок. [147]
- Go критиковали за акцент на простоте реализации, а не на правильности и гибкости; Например, язык использует семантику файлов POSIX на всех платформах и, следовательно, предоставляет неверную информацию на таких платформах, как Windows (которые не соответствуют вышеупомянутому стандарту). [148] [149]
- Исследование показало, что ошибки параллелизма при передаче сообщений так же легко допустить, как и при использовании общей памяти, а иногда и больше. [150]
Спор об имени
[ редактировать ]10 ноября 2009 г., в день общего релиза языка, Фрэнсис Маккейб, разработчик Go ! язык программирования (обратите внимание на восклицательный знак), попросил Google изменить название языка, чтобы избежать путаницы с его языком, на разработку которого он потратил 10 лет. [151] Маккейб выразил обеспокоенность тем, что «большой парень» в конечном итоге нападет на него, и эта обеспокоенность нашла отклик у более чем 120 разработчиков, которые прокомментировали официальную ветку проблем Google, заявив, что им следует сменить имя, причем некоторые [152] даже если сказать, что эта проблема противоречит девизу Google: « Не будь злым» . [153]
12 октября 2010 г. поданная заявка на публичную проблему была закрыта разработчиком Google Рассом Коксом (@rsc) с настраиваемым статусом «Неудачно», сопровождаемым следующим комментарием:
«Существует множество компьютерных продуктов и сервисов под названием Go. За 11 месяцев, прошедших с момента нашего выпуска, в двух языках произошла минимальная путаница». [153]
См. также
[ редактировать ]Примечания
[ редактировать ]- ^ Использование альтернативных бэкэндов снижает скорость компиляции и контроль Go над сборкой мусора, но обеспечивает лучшую оптимизацию машинного кода. [19]
- ^ Но «Чтобы сложные операторы могли занимать одну строку, точку с запятой можно опустить перед закрывающим ) или }». [54]
- ^ «если новая строка идет после токена, который может завершить оператор, [лексер] вставит точку с запятой». [55]
- ^ Обычно ровно одно из значений результата и ошибки имеет значение, отличное от нулевого значения типа; иногда оба варианта выполняются, например, когда чтение или запись могут быть завершены только частично, а иногда и то и другое, например, когда чтение возвращает 0 байт. См. раздел «Проблема полупредиката: многозначный возврат ».
- ^ Jump up to: а б Часто задаваемые вопросы по языку «Почему нет арифметики указателей? Безопасность... никогда не выводите недопустимый адрес, который выполняется неправильно... использование индексов массива может быть столь же эффективным, как... арифметика указателей... упростить реализацию сборщика мусора.. .." [4]
- ^ Часто задаваемые вопросы по языку «Почему в Go нет утверждений? ... наш опыт показывает, что программисты используют их как опору, чтобы не думать о правильной обработке ошибок и отчетах ...» [4]
- ^ Часто задаваемые вопросы по языку «Почему нет объединений без тегов...? [они] нарушили бы гарантии безопасности памяти Go». [4]
- ^ Часто задаваемые вопросы по языку «Почему в Go нет типов вариантов? ... Мы рассматривали [их, но] они запутанным образом перекрываются с интерфейсами .... [Некоторые] адреса некоторых типов вариантов уже рассмотрены, ... хотя и не так же элегантно». [4] (Тег типа интерфейса [112] доступ осуществляется с помощью утверждения типа [113] ).
- ^ Вопросы «Как мне получить динамическую отправку методов?» и «Почему нет наследования типов?» в FAQ по языку. [4]
Ссылки
[ редактировать ]- ^ «Codewalk: первоклассные функции в Go» .
Go поддерживает функции первого класса, функции высшего порядка, определяемые пользователем типы функций, функциональные литералы, замыкания и множественные возвращаемые значения. Этот богатый набор функций поддерживает стиль функционального программирования на строго типизированном языке.
- ^ «Является ли Go объектно-ориентированным языком?» . Проверено 13 апреля 2019 г.
Хотя Go имеет типы и методы и допускает объектно-ориентированный стиль программирования, иерархии типов здесь нет.
- ^ «Go: код, который растет с изяществом» . Проверено 24 июня 2018 г.
Go объектно-ориентирован, но не в обычном смысле.
- ^ Jump up to: а б с д и ж г час «Часто задаваемые вопросы по языковому дизайну» . Язык программирования Go . 16 января 2010 года . Проверено 27 февраля 2010 г.
- ^ Jump up to: а б «Текстовый файл ЛИЦЕНЗИЯ» . Язык программирования Go . Проверено 5 октября 2012 г.
- ^ «Спецификация языка программирования Go — язык программирования Go» .
- ^ Jump up to: а б «Почему в Go нет объявлений «реализует»?» . Язык программирования Go . Проверено 1 октября 2015 г.
- ^ Пайк, Роб (22 декабря 2014 г.). «Роб Пайк в Твиттере» . Архивировано из оригинала 7 апреля 2022 года . Проверено 13 марта 2016 г.
В Go используется структурная типизация, а не утиная типизация. Полное удовлетворение интерфейса проверено и обязательно.
- ^ "язык/гоу: го-1.4" . Порты OpenBSD . 23 декабря 2014 года . Проверено 19 января 2015 г.
- ^ «Перенесите усилия» . Перейти к языковым ресурсам . кот-в. 12 января 2010 года . Проверено 18 января 2010 г.
- ^ «Дополнительные права интеллектуальной собственности» . Язык программирования Go . Проверено 5 октября 2012 г.
- ^ Кинкейд, Джейсон (10 ноября 2009 г.). «Google’s Go: новый язык программирования, совместимый с Python и C++» . ТехКранч . Проверено 18 января 2010 г.
- ^ Мец, Кейд (5 мая 2011 г.). «Google Go смело идет туда, где еще не было кода» . Регистр .
- ^ «Язык называется Го или Голанг?» . Проверено 16 марта 2022 г.
Язык называется Go.
- ^ «Примечания к выпуску Go 1.5» . Проверено 28 января 2016 г.
Компилятор и среда выполнения теперь реализованы на Go и ассемблере, без C.
- ^ «Выпущена версия Go 1.11» . 24 августа 2018 г. Проверено 1 января 2019 г.
- ^ «Установка GCC: Конфигурация» . Проверено 3 декабря 2011 г.
Ada, Go и Objective-C++ не являются языками по умолчанию.
- ^ «Часто задаваемые вопросы: Реализация» . Язык программирования Go . 2 августа 2021 г. . Проверено 2 августа 2021 г.
- ^ "gollvm § Является ли gollvm заменой основного компилятора Go? (gc)" . Git в Google .
- ^ «Компилятор Go в JavaScript для запуска кода Go в браузере: Gopherjs/Gopherjs» . Гитхаб . Архивировано из оригинала 12 декабря 2023 года.
- ^ «Идите в Google: языковой дизайн на службе разработки программного обеспечения» . Проверено 8 октября 2018 г.
- ^ Пайк, Роб (28 апреля 2010 г.). «Еще один подход к языковому дизайну» . Стэнфордский коллоквиум по компьютерным системам . Стэнфордский университет . Видео доступно .
- ^ «Часто задаваемые вопросы (FAQ) — язык программирования Go» . Язык программирования Go . Проверено 26 февраля 2016 г.
- ^ Бинсток, Эндрю (18 мая 2011 г.). «Доктор Добб: Интервью с Кеном Томпсоном» . Архивировано из оригинала 5 января 2013 года . Проверено 7 февраля 2014 г.
- ^ Пайк, Роб (2012). «Меньше значит экспоненциально больше» .
- ^ Гриземер, Роберт (2015). «Эволюция Го» .
- ^ Гриземер, Роберт; Пайк, Роб; Томпсон, Кен; Тейлор, Ян; Кокс, Расс; Ким, Джини; Лэнгли, Адам. «Эй! Хо! Поехали!» . Google с открытым исходным кодом . Проверено 17 мая 2018 г.
- ^ Шенкленд, Стивен (30 марта 2012 г.). «Языку Google Go исполнился год, он завоевал место на YouTube: язык программирования нижнего уровня достаточно созрел, чтобы иметь номер версии 1.0. И он используется для реальной работы в Google» . Новости. CNet . CBS Interactive Inc. Проверено 6 августа 2017 г.
Google выпустила первую версию своего языка программирования Go — амбициозную попытку улучшить гигантов мира программирования нижнего уровня, таких как C и C++.
- ^ «История выпусков» . Язык программирования Go .
- ^ «Часто задаваемые вопросы по Go: использует ли Google Go внутри себя?» . Проверено 9 марта 2013 г.
- ^ «Go Gopher — язык программирования Go» . go.dev . Проверено 9 февраля 2023 г.
- ^ «Го шрифты» . Идти. 16 ноября 2016 г. Проверено 12 марта 2019 г.
- ^ «Go Font TTF» . Гитхаб . Проверено 2 апреля 2019 г.
- ^ «Новый бренд Go» . Блог Go . Проверено 9 ноября 2018 г.
- ^ Меррик, Алиса (9 марта 2021 г.). «Результаты опроса разработчиков Go 2020» . Перейти на язык программирования . Проверено 16 марта 2022 г.
- ^ Jump up to: а б Пайк, Роб (26 сентября 2013 г.). «Массивы, фрагменты (и строки): механика добавления » . Блог Go . Проверено 7 марта 2015 г.
- ^ «E2E: Эрик Мейер и Роберт Гриземер» . Канал 9 . Майкрософт. 7 мая 2012 г.
- ^ «Перейти к 2 эскизным проектам» . Проверено 12 сентября 2018 г.
- ^ «Блог Go: Черновые проекты Go 2» . 28 августа 2018 г.
- ^ «Предложение: встроенная функция проверки ошибок Go, «попробуй» » . Репозиторий Go на GitHub . Проверено 16 марта 2022 г.
- ^ «Типовые параметры — Эскизный проект» . go.googlesource.com .
- ^ «Дженериксы в Go» . bitfieldconsulting.com . 17 декабря 2021 г.
- ^ «Go 1.18 выпущен!» . Перейти на язык программирования . 15 марта 2022 г. Проверено 16 марта 2022 г.
- ^ «Go 1 и будущее программ Go» . Язык программирования Go .
- ^ «Примечания к выпуску Go 1.22» . Язык программирования Go .
- ^ «История выпусков» . Язык программирования Go .
- ^ «Обратная совместимость, Go 1.21 и Go 2» . Язык программирования Go .
- ^ «Краткое руководство по ассемблеру Go» . go.dev . Проверено 31 декабря 2021 г.
- ^ Пайк, Роб. «Язык программирования Go» . Ютуб . Проверено 1 июля 2011 г.
- ^ Пайк, Роб (10 ноября 2009 г.). Язык программирования Go (flv) (Технический разговор). Google. Событие происходит в 8:53.
- ^ «Загрузить и установить пакеты и зависимости» . См. godoc.org для получения адресов и документации некоторых пакетов.
- ^ «ГоДок» . godoc.org .
- ^ Пайк, Роб. «Журнал изменений» (подкаст). Архивировано из оригинала 20 октября 2013 года . Проверено 7 октября 2013 г.
- ^ «Спецификация языка программирования Go, §точки с запятой» . Язык программирования Go .
- ^ «Эффективное движение, §точки с запятой» . Язык программирования Go .
- ^ «Спецификация языка программирования Go» . Язык программирования Go .
- ^ Пайк, Роб (23 октября 2013 г.). «Строки, байты, руны и символы в Go» .
- ^ Докси, Калеб. «Структуры и интерфейсы — введение в программирование на Go» . www.golang-book.com . Проверено 15 октября 2018 г.
- ^ Герран, Эндрю. «Go Slices: использование и внутреннее устройство» .
- ^ Авторы Go. «Эффективное го: срезы» .
- ^ Авторы Go. «Селекторы» .
- ^ Авторы Go. «Звонки» .
- ^ «Спецификация языка программирования Go, §Пакет небезопасен» . Язык программирования Go .
- ^ «Спецификация языка программирования Go» . go.dev . Проверено 31 декабря 2021 г.
- ^ «Спецификация языка программирования Go» . Язык программирования Go .
- ^ «Экскурсия по Го» . go.dev .
- ^ «Спецификация языка программирования Go» . Язык программирования Go .
- ^ «Спецификация языка программирования Go» . go.dev . Проверено 31 декабря 2021 г.
- ^ «Спецификация языка программирования Go» . Язык программирования Go .
- ^ Jump up to: а б Шмагер, Франк; Кэмерон, Николас; Ноубл, Джеймс (2010). GoHotDraw: оценка языка программирования Go с помощью шаблонов проектирования . Оценка и удобство использования языков и инструментов программирования. АКМ.
- ^ Jump up to: а б с д и Бальберт, Иво (2012). Путь к Go: подробное введение в язык программирования Go . iUniverse.
- ^ «Эволюция Го» . talks.golang.org . Проверено 13 марта 2016 г.
- ^ Диггинс, Кристофер (24 ноября 2009 г.). «Утиная типизация и язык программирования Go» . Доктор Доббс, Мир разработки программного обеспечения . Проверено 10 марта 2016 г.
- ^ Райер, Мэт (1 декабря 2015 г.). «Утка печатает на Go» . Проверено 10 марта 2016 г.
- ^ «Часто задаваемые вопросы (FAQ) — язык программирования Go» . Язык программирования Go .
- ^ «Спецификация языка программирования Go» . Язык программирования Go .
- ^ «Спецификация языка программирования Go» . Язык программирования Go .
- ^ «отражающий пакет» . pkg.go.dev .
- ^ "map[string]interface{} в Go" . bitfieldconsulting.com . 6 июня 2020 г.
- ^ «Структуры данных Go: Интерфейсы» . Проверено 15 ноября 2012 г.
- ^ «Спецификация языка программирования Go» . Язык программирования Go .
- ^ «Примечания к выпуску Go 1.18: дженерики» . Перейти на язык программирования . 15 марта 2022 г. Проверено 16 марта 2022 г.
- ^ «Предложение типовых параметров» . go.googlesource.com . Проверено 25 июня 2023 г.
- ^ «Спецификация языка программирования Go — Язык программирования Go» . go.dev . Проверено 25 июня 2023 г.
- ^ «Введение в дженерики — язык программирования Go» . go.dev . Проверено 25 июня 2023 г.
- ^ «Предложение типовых параметров» . go.googlesource.com . Проверено 25 июня 2023 г.
- ^ «Эффективное движение» . golang.org . Авторы Go . Проверено 13 мая 2014 г.
- ^ «Урок по языку программирования Go» . Язык программирования Go . Проверено 10 марта 2013 г.
В Go правило видимости информации простое: если имя (типа верхнего уровня, функции, метода, константы или переменной, поля или метода структуры) написано с заглавной буквы, пользователи пакета могут его увидеть. В противном случае имя и, следовательно, именуемый объект видны только внутри пакета, в котором оно объявлено.
- ^ "идти" . Язык программирования Go .
- ^ «Как писать код Go» . Язык программирования Go .
Пакетам из стандартной библиотеки предоставляются короткие пути импорта, такие как «fmt» и «net/http». Для ваших собственных пакетов вы должны выбрать базовый путь, который вряд ли будет конфликтовать с будущими дополнениями к стандартной библиотеке или другим внешним библиотекам. Если вы храните свой код где-то в исходном репозитории, вам следует использовать корень этого исходного репозитория в качестве базового пути. Например, если у вас есть учетная запись примера на сайте example.com/user, это должен быть ваш базовый путь.
- ^ Jump up to: а б Пайк, Роб (18 сентября 2012 г.). «Конкурентность — это не параллелизм» .
- ^ Jump up to: а б Донован, Алан А.А.; Керниган, Брайан В. (2016). Язык программирования Go . Серия профессиональных компьютеров Аддисона-Уэсли. Нью-Йорк, Мюнхен: Аддисон-Уэсли. ISBN 978-0-13-419044-0 .
- ^ Jump up to: а б с д и Чисналл, Дэвид (2012). Разговорник по языку программирования Go . Аддисон-Уэсли. ISBN 9780132919005 .
- ^ «Эффективное движение» . Язык программирования Go .
- ^ Саммерфилд, Марк (2012). Программирование на Go: создание приложений для 21 века . Аддисон-Уэсли.
- ^ «Модель памяти Go» . Проверено 10 апреля 2017 г.
- ^ «Шаблоны параллелизма Go» . Язык программирования Go .
- ^ Грэм-Камминг, Джон (24 августа 2013 г.). «Переработка буферов памяти в Go» .
- ^ "дерево.го" .
- ^ Чеслак-Постава, Юэн. «Итераторы в Go» .
- ^ Керниган, Брайан В. «Спуск в подвешенное состояние» .
- ^ Jump up to: а б «Модель памяти Go» . Проверено 5 января 2011 г.
- ^ Тан, Пейи (2010). Многоядерное параллельное программирование на Go (PDF) . Учеб. Первая международная конференция по передовым вычислениям и коммуникациям. Архивировано из оригинала (PDF) 9 сентября 2016 года . Проверено 14 мая 2015 г.
- ^ Нанц, Себастьян; Уэст, Скотт; Соареш да Силвейра, Кауэ. Исследование пробелов в экспертах в параллельном программировании (PDF) . Европар 2013. CiteSeerX 10.1.1.368.6137 .
- ^ Перейти Авторы. «Делитесь воспоминаниями, общаясь» .
- ^ Кокс, Расс . «На гонки» .
- ^ Пайк, Роб (25 октября 2012 г.). «Идите в Google: языковой дизайн на службе разработки программного обеспечения» . Google, Inc. «Есть одно важное предостережение: Go не является полностью безопасным для памяти при наличии параллелизма».
- ^ «Представляем детектор гонок Go» . Блог Go . Проверено 26 июня 2013 г.
- ^ «Примечания к выпуску Go 1.6 — язык программирования Go» . go.dev . Проверено 17 ноября 2023 г.
- ^ «Часто задаваемые вопросы (FAQ) — язык программирования Go» .
- ^ «История о двоичном файле Fat Go» . 21 сентября 2018 г.
- ^ «Спецификация языка программирования Go, §Типы интерфейсов» . Язык программирования Go .
- ^ «Спецификация языка программирования Go, §Утверждения типов» . Язык программирования Go .
- ^ «Все системы работают» . информИТ (Интервью). 17 августа 2010 года . Проверено 21 июня 2018 г.
- ^ «Часто задаваемые вопросы по языковому дизайну» . 13 ноября 2009 г. Архивировано из оригинала 13 ноября 2009 г.
- ^ «Предложение о механизме исключения» . голанг-орехи . 25 марта 2010 года . Проверено 25 марта 2010 г.
- ^ «Еженедельная история снимков» . Язык программирования Go .
- ^ «Паника и выздоровление» . Зайди вики.
- ^ «Эффективное движение» . Язык программирования Go .
- ^ "гофмт" . Язык программирования Go . Проверено 5 февраля 2021 г.
- ^ «публичный архив golang/lint» . github.com . 30 ноября 2022 г.
- ^ Jump up to: а б «Эффективное движение» . Язык программирования Go .
- ^ «Неиспользуемые локальные переменные» . yourbasic.org . Проверено 11 февраля 2021 г.
- ^ «Импорт неиспользуемых пакетов» . yourbasic.org . Проверено 11 февраля 2021 г.
- ^ «Комментарии к проверке кода» . Гитхаб . Проверено 3 июля 2018 г.
- ^ «Разговоры» . Проверено 3 июля 2018 г.
- ^ «Ошибки — это ценности» . Проверено 3 июля 2018 г.
- ^ «tools/gopls/README.md в мастере · golang/tools» . Гитхаб . Проверено 17 ноября 2023 г.
- ^ "ФМТ" . Язык программирования Go . Проверено 8 апреля 2019 г.
- ^ «тестирование» . Язык программирования Go . Проверено 27 декабря 2020 г.
- ^ Ли, Вэй-Мэн (24 ноября 2022 г.). «Введение в язык программирования Go» . Журнал разработчиков компонентов . Архивировано из оригинала 5 июня 2023 года . Проверено 8 сентября 2023 г.
- ^ Хоффманн, Франк; Ноймайер, Мэнди (август 2018 г.). «Просто безопасно» . Журнал Линукс . № 213. Архивировано из оригинала 28 мая 2023 года . Проверено 8 сентября 2023 г.
- ^ Ли, Вэй-Мэн (31 августа 2022 г.). «Введение в контейнеризацию с использованием Docker» . Журнал КОД . Архивировано из оригинала 30 мая 2023 года . Проверено 8 сентября 2023 г.
- ^ Пиркер, Александр (24 февраля 2023 г.). «Безопасность Kubernetes для начинающих» . Журнал КОД . Архивировано из оригинала 1 апреля 2023 года . Проверено 8 сентября 2023 г.
- ^ Тафт, Ребекка; Шариф, Ирфан; Матей, Андрей; Ван Беншотен, Натан; Льюис, Джордан; Григер, Тобиас; Ниеми, Кай; Вудс, Энди; Бирзин, Энн; Посс, Рафаэль; Бардеа, Пол; Ранаде, Амрута; Дарнелл, Бен; Грюнейр, Брэм; Джафрей, Джастин; Чжан, Люси; Мэттис, Питер (11 июня 2020 г.). «CockroachDB: отказоустойчивая геораспределенная база данных SQL». Материалы Международной конференции ACM SIGMOD 2020 по управлению данными . СИГМОД '20. стр. 1493–1509. дои : 10.1145/3318464.3386134 . ISBN 978-1-4503-6735-6 .
- ^ Хопкинс, Брэндон (13 сентября 2022 г.). «Создание статического сайта с Хьюго» . Linux-журнал . Архивировано из оригинала 8 апреля 2023 года . Проверено 8 сентября 2023 г.
- ^ Симионато, Микеле (15 ноября 2009 г.). «Интерфейсы vs наследование (или остерегайтесь Go!)» . артима . Проверено 15 ноября 2009 г.
- ^ Астелс, Дэйв (9 ноября 2009 г.). «Готово, готово, вперед!» . машинный завод. Архивировано из оригинала 19 октября 2018 года . Проверено 9 ноября 2009 г.
- ^ jt (11 января 2010 г.). «Go от Google получил награду «Язык программирования года»» . Джексентер . Проверено 5 декабря 2012 г.
- ^ «Индекс сообщества программистов TIOBE за июнь 2015 г.» . Программное обеспечение ТИОБЕ. Июнь 2015 года . Проверено 5 июля 2015 г.
- ^ «Индекс ТИОБЕ» . ТИОБЕ . Проверено 15 июля 2024 г.
- ^ Экель, Брюс (27 августа 2011 г.). «Вызов Go из Python через JSON-RPC» . Проверено 29 августа 2011 г.
- ^ Хундт, Роберт (2011). Распознавание циклов в C++/Java/Go/Scala (PDF) . Дни Скалы.
- ^ Мец, Кейд (1 июля 2011 г.). «Google Go наносит ответный удар с помощью C++» . Регистр .
- ^ Ягер, Уилл. «Почему Го — это плохо» . Проверено 4 ноября 2018 г.
- ^ Добронский, Янош. «Повседневные хлопоты в Го» . Проверено 4 ноября 2018 г.
- ^ «Почему здесь фигурные скобки, но нет точек с запятой? И почему я не могу поставить открывающую скобку на следующей строке?» . Проверено 26 марта 2020 г.
Преимущества единого, программно обязательного формата для всех программ Go значительно перевешивают любые предполагаемые недостатки конкретного стиля.
- ^ «Я хочу отказаться от дикой поездки мистера Голанга» . 28 февраля 2020 г. . Проверено 17 ноября 2020 г.
- ^ «Предложение: os: Create/Open/OpenFile() установите FILE_SHARE_DELETE в Windows # 32088» . Гитхаб . 16 мая 2019 г. . Проверено 17 ноября 2020 г.
- ^ Ту, Тэнфэй (2019). «Понимание реальных ошибок параллелизма в Go» (PDF) .
Например, около 58% ошибок блокировки вызваны передачей сообщений. Помимо нарушения правил использования канала Go (например, ожидание канала, на который никто не отправляет данные или его закрытие), многие ошибки параллелизма вызваны смешанным использованием передачи сообщений и другой новой семантики и новых библиотек в Go, которые можно легко не заметить, но трудно обнаружить
- ^ Браунли, Джон (13 ноября 2009 г.). «Google не вводил в Google слово Go перед тем, как назвать свой язык программирования » . Архивировано из оригинала 8 декабря 2015 года . Проверено 26 мая 2016 г.
- ^ Клэберн, Томас (11 ноября 2009 г.). «Название Google Go вызывает обвинения во зле » . Информационная неделя. Архивировано из оригинала 22 июля 2010 года . Проверено 18 января 2010 г.
- ^ Jump up to: а б «Проблема 9 — вперед — я уже использовал название *МОЕГО* языка программирования» . Гитхаб . Google Inc. Проверено 12 октября 2010 г.
Дальнейшее чтение
[ редактировать ]- Донован, Алан; Керниган, Брайан (октябрь 2015 г.). Язык программирования Go (1-е изд.). Аддисон-Уэсли Профессионал . п. 400. ИСБН 978-0-13-419044-0 .
- Боднер, Джон (март 2021 г.). Изучение го (1-е изд.). О'Рейли . п. 352. ИСБН 9781492077213 .
Внешние ссылки
[ редактировать ]- Го (язык программирования)
- Американские изобретения
- Семейство языков программирования C
- Параллельные языки программирования
- Кроссплатформенное бесплатное программное обеспечение
- Кроссплатформенное программное обеспечение
- Бесплатные компиляторы и интерпретаторы
- программное обеспечение Google
- Языки программирования высокого уровня
- Процедурные языки программирования
- Языки программирования
- Языки программирования, созданные в 2009 году.
- Программное обеспечение, использующее лицензию BSD
- Статически типизированные языки программирования
- Языки системного программирования