Wed .19 Oct 2019

Перейти (мова програмування)

Gong часто називають голанг - вільною та відкритим кодом [12], мова програмування, створена в Google [13] у 2007 році Робертом Гріземером, Роб Піком та Кеном Томпсоном [10] Це складена, статично типова мова в традиції Algol та C, зі збиранням сміття, обмеженою структурною типізацією, [3] додано функції безпеки пам’яті та функції паралельного програмування у стилі CSP [14]. Мова була оголошена у листопаді 2009 року; його використовують у деяких виробничих системах Google [15], а також інших фірм Існують дві основні реалізації:компілятор Go, "gc", розробляється як програмне забезпечення з відкритим кодом та націлений на різні платформи, включаючи Linux, OS X, Windows, різні версії BSD та Unix, а з 2015 року також мобільні пристрої, включаючи смартфони [16] Другий компілятор, gccgo, є фронтендом GCC [17] [18] Пакет інструментів "gc" є самостійним хостингом з версії 15 [19]
Зміст - 1 Історія - 2 Мовний дизайн - 21 Критика - 22 Синтаксис - 23 типи - 231 Інтерфейсна система - 24 Пакетна система - 25 Паралельність:програми та канали
251 Придатність для паралельного програмування - 252 Відсутність безпеки умов перегонів - 26 Пропуски - 3 Конвенції та стиль коду - 4 Мовні інструменти - 5 Приклади - 51 Привіт, світ! 52 Приклад спільної валюти - 6 проектів, що використовують Go - 7 Прийом - 8 Суперечка щодо імен - 9 Дивіться також - 10 Примітки - 11 Посилання - 12 Зовнішні посилання - 121 Громада та конференції
Історія
Go orig в якості експерименту інженери Google Роберт Гріземер, Роб Пайк та Кен Томпсон розробили нову мову програмування, яка б вирішувала загальну критику інших мов, зберігаючи їх позитивні характеристики [20]. Нова мова повинна була:
бути статично набраною , масштабований для великих систем, як Java та C ++;
бути продуктивним та читабельним, без занадто багато обов’язкових ключових слів та повторень [21] "світло на сторінці", як динамічні мови;
не потребує інструментації, але добре підтримуйте його,
підтримка мереж та багатопроцесорної роботи. У наступних інтерв'ю всі три мовні дизайнери назвали свою неприязнь до складності C ++ як основну мотивацію розробки нової мови [22] [23] [24]
10 було випущено в березні 2012 року [25] - Go 17 додав "одну крихітну зміну мови" [26] та один порт до macOS 1012 Sierra плюс деякі експериментальні порти, наприклад, для Linux на z Systems linux / s390x Деякі зміни бібліотеки застосовуються, і наприклад, Unicode 90 тепер підтримується. Мовна конструкція в традиції C, але вносить багато змін для покращення стислості, простоти та безпеки. Нижче наведено короткий огляд функцій, які визначають Go:
Синтаксис та середовище, що сприймають шаблони, більш поширені в динамічних мовах:[27]
Необов'язкове коротке оголошення змінної та ініціалізація за допомогою виводу типу x:= 0 not var x int = 0;
Швидкі часи компіляції [28]
Віддалене управління пакетами go get [29] та онлайн-документація на пакет [30]
Відмінні підходи до конкретних проблем:
Вбудовані примітиви одночасності:легкі процеси, процедури, канали та оператор select. Інтерфейсна система замість віртуального успадкування та введення типу замість невіртуального. наслідування - ланцюжок інструментів, що за замовчуванням виробляє статично пов'язані нативні бінарні файли без зовнішніх залежностей. Бажання зберегти специфікацію мови досить простою, щоб утримувати її в голові програміста, [31] частково, опускаючи функції, спільні для подібних мов
Критика Критики ism
Go стверджують, що:відсутність генерики часу компіляції призводить до дублювання коду, метапрограмування неможливо перевірити статично [32] [33], а стандартна бібліотека не може запропонувати загальних алгоритмів [34]
відсутність мови розширюваність через, наприклад, перевантаження оператора, робить певні завдання більш багатослівними [32] [35] - відсутність типової системи, що типізує Гіндлі-Мілнер, що гальмує безпеку та / або виразність [36] [37] - паузи та накладні витрати збору сміття GC обмежують використання Go у системах програмування порівняно з мовами з ручним управлінням пам’яттю [32] [36]
Мовні дизайнери стверджують, що ці вигоди є важливими для успіху Go [38], і пояснюють деякі конкретні рішення на довжина [39], хоча вони виявляють відкритість до додавання певної форми загального програмування у майбутньому та до прагматичних удосконалень у таких сферах, як стандартизація способів застосування коду [40] Що стосується GC, захисники Go вказують на зменшення часу паузи на пізніше версії [41], наприклад, Go 16 під час підтвердження g їх алгоритм GC не важкий у режимі реального часу - Синтаксис Go у синтаксисі Go включає зміни від C, спрямовані на збереження стислості та читабельності коду. Введено комбінований оператор декларації / ініціалізації, який дозволяє програмісту записувати i:= 3 або s := "деякі слова", не вказуючи типи змінних. Це контрастує з C's int i = 3; і const char s = "деякі слова"; Точки з комою все ще припиняють оператори, але неявні, коли вони відбудуться в кінці рядка. Функції можуть повертати декілька значень, і повертаючи результат, пара помилок - це звичайний спосіб, коли функція вказує на помилку свого виклику в програмі Go [a] Go додає Буквальні синтаксиси для ініціалізації параметрів структури за назвою та для ініціалізації карт та фрагментів Як альтернатива тривикладному контенту C для циклу, вирази діапазону Go дозволяють стислі ітерації над масивами, фрагментами, рядками, картами та каналами. Типи
Go має ряд вбудованих типів, включаючи числові байти, int64, float32 тощо, булеві рядки та рядки символьних рядків рядки є незмінними; Вбудовані оператори та ключові слова, а не функції, забезпечують конкатенацію, порівняння та кодування та декодування UTF-8 [42] Типи записів можна визначити за допомогою ключового слова struktur. Для кожного типу T та кожної невід’ємної цілої постійної n, там - тип масиву, позначений [n] T; масиви різної довжини, таким чином, мають різні типи. Динамічні масиви доступні у вигляді "фрагментів", позначених [] T для деякого типу T Вони мають довжину та ємність, що визначають, коли для розширення масиву потрібно виділити нову пам'ять. Декілька фрагментів можуть поділяти їх основна пам'ять [43] [44] [45]
Покажчики доступні для всіх типів, а тип вказівника на T позначається T Адресування та непряме використання використовують & amp; і операторів, як у C, або трапляються неявно через синтаксис доступу виклику або атрибуту методу [46] Не існує арифметики вказівника, за винятком спеціального небезпечного типу Pointer у стандартній бібліотеці. Для пари типів K, V - тип map [K] V - тип хеш-таблиць, які відображають ключі типу K до значень типу V, Таблиці хешів вбудовані в мову, зі спеціальним синтаксисом і вбудованими функціями chan T - канал, що дозволяє надсилати значення типу T між паралельні процеси Go - Окрім підтримки інтерфейсів, система типу Go є номінальною:ключове слово type може бути використане для визначення нового названого типу, який відрізняється від інших названих типів, які мають однаковий макет у випадку структури , однакові члени в тому ж порядку. Деякі конверсії між типами, наприклад, між різними цілими типами, попередньо визначені, і додавання нового типу може визначати додаткові перетворення, але перетворення між названими типами завжди повинні бути чітко викликані [47] Наприклад, тип ключового слова можна використовувати для визначення ine тип для IPv4-адрес, які є 32-бітовими цілими числами без підпису:
тип ipv4addr uint32
За допомогою цього визначення типу, ipv4addrx інтерпретує значення uint32 x як IP-адресу. Просто призначивши x змінній типу ipv4addr є помилка типу - Постійні вирази можуть бути або набрані, або "нетипізовані"; їм присвоюється тип, коли їм присвоюється введена змінна, якщо значення, яке вони представляють, проходить перевірку часу компіляції [48] - Типи функцій позначаються ключовим словом func; вони приймають нульові або більше параметрів і повертають нульове або більше значення, всі вони набираються Параметр і значення повернення визначають тип функції; таким чином, funcstring, int32 int, помилка - це тип функцій, які беруть рядок та 32-бітове ціле число, підписане, і повертають підписане ціле число за замовчуванням та значення помилки вбудованого інтерфейсу. Будь-який названий тип має пов'язаний з ним набір методів. Приклад IP-адреси, описаний вище, може бути розширений методом перетворення адреси в читане людиною представлення, а саме // // Це нульова широкомовна адреса 255255255255 - func addr ipv4addr ZeroBroadcast bool
Через номінальне введення тексту, це визначення методу додає метод в ipv4addr, але не на uint32 Хоча методи мають спеціальне визначення та синтаксис виклику, не існує виразного типу методу [49]
Система інтерфейсу
Go забезпечує дві особливості, які замінюють успадкування класу. Перша - вбудовування, яку можна розглядати як автоматизовану форму композиції [50] або делегування [51]:255
Друга - це її інтерфейси, що забезпечують поліморфізм часу виконання [52] :266 Інтерфейси забезпечують обмежену форму структурного набору тексту у інших словах se Система номінального типу Go Будь-який тип, який реалізує всі методи інтерфейсу, відповідає цьому інтерфейсу. Інтерфейси Go були розроблені після протоколів з мови програмування Smalltalk [53] У кількох джерелах використовується термін введення качки при описі інтерфейсу Go [54] [55] Хоча термін "тип качки" не визначений точно і, отже, не є помилковим, це означає, що відповідність типу не перевіряється статично. Оскільки відповідність інтерфейсу Go перевіряється статично за допомогою компілятора Go, за винятком випадків, коли виконується затвердження типу, автори Go вважають за краще використовувати термін структурний набір тексту - Інтерфейс вказує набір типів, перераховуючи необхідні методи та їх типи, і задовольняється будь-яким типом, який має необхідні методи. Типи реалізації не потребують вказівки на їх реалізацію інтерфейсів, тому якщо Shape, Square і Circle визначаються як:імпорт "математика"
тип інтерфейс типу - тип квадратний структура - функція пл Площа площі float64 - тип коло структура - func c Circl e Area float64
, то і Square, і Circle неявно є Shape, і їх можна присвоїти змінній типу Shape [52]:263–268 Формально мовою, система інтерфейсів Go забезпечує структурну, а не номінальну типізацію. Інтерфейси можуть вбудовувати інші інтерфейси з ефектом створення комбінованого інтерфейсу, який задовольняється саме типами, які реалізують вбудований інтерфейс, та будь-якими методами, які додає щойно визначений інтерфейс [52]:270
Стандартна бібліотека Go використовує інтерфейси для забезпечення загальної в декількох місцях, включаючи систему вводу / виводу, яка базується на концепціях Reader and Writer [52]:282–283
Крім виклику методів через інтерфейси, Go дозволяє перетворювати значення інтерфейсу в інші типи за допомогою перевірки типу виконання під час мовної побудови зробити це твердженням типу [56], який перевіряє один тип потенційного типу, і комутатором типу [57], який перевіряє кілька типів. Порожній інтерфейс є важливим випадком, оскільки він може посилатися до елемента будь-якого конкретного типу Це схоже на клас Object на Java або C #, але з тією різницею, що порожній інтерфейс задовольняється будь-яким типом, включаючи вбудовані типи, такі як int, а в Java та C #, змінна Object може утримуйте лише екземпляри типу посилання [52]:284 Код, що використовує порожній інтерфейс, не може просто викликати методи або вбудовані оператори на об'єкт, що згадується, але він може зберігати значення інтерфейсу, спробуйте перетворити його в більш корисний тип через затвердження типу або перемикача типу, або огляньте його за допомогою пакету відображення Go [58] Оскільки інтерфейс може посилатися на будь-яке значення, це обмежений спосіб уникнути обмежень статичного набору тексту, наприклад, void у C, але з додатковими перевірками типу виконання
Значення інтерфейсу реалізуються за допомогою покажчика на дані та другого вказівника на інформацію про тип часу [59] Як і деякі інші типи, реалізовані за допомогою покажчиків у Go, значення інтерфейсу є нульовими, якщо неініціалізовані [60]
Пакетна система
У пакетній системі Go кожен пакет має шлях, наприклад, "c ompress / bzip2 "або" golangorg / x / net / html "та ім'я, наприклад, bzip2 або html Посилання на визначення інших пакетів завжди мають бути встановлені з назвою іншого пакета, і доступні лише великі імена з інших пакетів:ioReader є загальнодоступним, але bzip2reader не є [61] Команда go get може отримати пакети, що зберігаються у віддаленому сховищі, наприклад, GitHub, [62], і розробникам рекомендується розробляти пакети всередині базового контуру, що відповідає сховищу джерела, наприклад githubcom / user_name / package_name для зменшення ймовірності зіткнення імені з майбутніми доповненнями до стандартної бібліотеки чи інших зовнішніх бібліотек [63]. Існують пропозиції щодо запровадження правильного рішення щодо управління пакетом для Go, подібного до вантажної системи Руста або npm-системи Node [64]
Паралельність:програми та канали
Мова Go має вбудовані засоби, а також бібліотечну підтримку для написання одночасних програм. Паралельність відноситься не тільки до паралелізму процесора, але і до асинхронності:дозволяючи повільно такі операції, як робота з базою даних чи читанням у мережі, коли програма виконує іншу роботу, як це часто зустрічається на серверах, що базуються на подіях [65]. Основна конструкція одночасності - це програма, тип легкого процесу, функція виклику функції з префіксом ключове слово go запускає функцію в новій goroutine У мовній специфікації не вказано, як повинні бути реалізовані goututines, але поточні реалізації мультиплексують goroutines процесу Go на менший набір потоків операційної системи, подібний до планування, виконаного в Erlang [66]:10
У той час як доступний стандартний бібліотечний пакет, який містить більшість класичних структур управління кон'юнктурою, блоки mutex тощо, [66]:151–152 ідіоматичні паралельні програми замість цього віддають перевагу каналам, які забезпечують надсилання повідомлень між горами [67] Додатковий буфер зберігання повідомлення у порядку FIFO [51]:43 і дозволяють надсилати goututines до того, як їх повідомлення будуть отримані. Канали набрані, так що канал типу chan T можна використовувати лише для передачі повідомлення типу T Спеціальний синтаксис використовується для роботи над ними; & lt; -ch - це вираз, який викликає блокування виконуваної програми, поки значення не надходить над каналом ch, тоді як ch З цих інструментів можна побудувати паралельні конструкції, такі як робочі пули, трубопроводи, в яких, скажімо, файл декомпресується та розбирається під час завантаження, фонові виклики з таймаутом, «вивільнення» паралельних викликів до набору служб та інші [68] Також канали знайшли використання, що витікає від звичного поняття міжпроцесорної комунікації, наприклад, що слугує безпечним для сумі списку перероблених буферів [69], реалізуючи процедури, які допомогли надихнути назву goutut, [70] та реалізувати ітератори [71]
Структурні конвенції каналів Go та альтернативних каналів, пов'язані з конкурсією, походять від моделі послідовних комунікаційних процесів Тоні Хоара на відміну від попередніх одночасних мов програмування, таких як Occam або Limbo, мова на w над яким працював співавтор Go Rob Pike, [72] Go не надає ніякого вбудованого поняття безпечної або перевіреної одночасності [73] Хоча модель передачі комунікаційних процесів надає перевагу в Go, вона не єдина:всі програми в програма поділяє єдиний адресний простір Це означає, що об'єкти та вказівники, що змінюються, можуть спільно використовуватися між програмами; див. § Відсутність безпеки умов перегонів, нижче - Придатність для паралельного програмування
Хоча функції одночасності програми Go не спрямовані насамперед на паралельну обробку [65], вони можуть бути використані для програмування багатопроцесорних машин спільної пам'яті. зроблено для ефективності цього підходу [74] Одне з цих досліджень порівняло розмір у рядках коду та швидкість програм, написаних досвідченим програмістом, не знайомим з мовою та виправленнями цих програм експертом Go із команди розробників Google. те ж саме для Chapel, Cilk та Intel TBB. У дослідженні було встановлено, що неексперт прагнув писати алгоритми ділення та перемоги з одним оператором ходу за рекурсію, тоді як експерт писав програми розподілу-роботи-синхронізації за допомогою однієї програми на кожен процесор. програми зазвичай були швидшими, але й тривалішими [75]
Відсутність безпеки умов перегонів
Немає обмежень щодо доступу програм до спільних даних, що робить можливими умови перегонів. Інакше, якщо програма явно не синхронізується через канали чи іншими засобами, запис з однієї goroutter може бути частково, цілком або зовсім не видимий іншому, часто без гарантій щодо впорядкування записів [73] Крім того, внутрішні структури даних Go, такі як інтерфейс значення, заголовки зрізів, хеш-таблиці та заголовки рядків не захищені від перегонових умов, тому безпека типу та пам’яті може бути порушена у багатопотокових програмах, які змінюють спільні екземпляри цих типів без синхронізації [76] [77]
Замість мови підтримка, безпечне одночасне програмування, таким чином, спирається на конвенції; наприклад, Chisnall рекомендує ідіому під назвою "псевдоніми xor mutable", що означає, що передача змінного значення або вказівника по каналу сигналізує про передачу права власності на значення його приймачу [66]:155
Пропуски
Перехід навмисно пропускає певні риси, поширені в інших мовах, включаючи успадкування реалізації, загальне програмування, твердження, арифметичні покажчики та перетворення неявного типу. З цих мовних особливостей автори Go висловлюють відкритість до загального програмування, явно заперечують проти тверджень та арифметики вказівника, захищаючи вибір пропустити успадкування типу як надання більш корисної мови, заохочення замість цього використовувати інтерфейси для досягнення динамічної відправки [b] та композиції для повторного використання коду. Склад та делегування фактично значною мірою автоматизовані шляхом вбудовування структури; На думку дослідників Шмагера та ін., ця особливість "має багато недоліків успадкування:вона впливає на публічний інтерфейс об'єктів, вона не є дрібнозернистою, тобто ніякий контроль на рівні методу вбудовування не може бути прихований. і це статично ", що робить" не очевидним ", чи програмісти не зловживають ним, якщо програмісти іншими мовами вважають за надмірне використання спадкування [50]
Що стосується загального програмування, деякі вбудовані функції насправді є типом -загальні, але вони трактуються як особливі випадки; Роб Пайк називає це слабкістю мови, яка в якийсь момент може бути змінена [43] Команда Google, яка розробляє мову, побудувала принаймні один компілятор для експериментального діалекту Go з генериками, але не випустила його [78]
Після того як спочатку було виключено винятки, до мови було додано механізм паніки / відновлення, подібного до винятку, який автори Go рекомендують використовувати для невиправних помилок, таких як ті, які повинні зупинити весь запит програми або сервера, або як ярлик для поширення помилок стек в пакеті, але не через межі пакета; там повернення помилок - це стандартний API [79] [80] [81] [82] - Конвенції та стиль коду
Автори Go докладають значних зусиль для формування стилю та дизайну програм Go:
, інтервал та інші деталі на рівні коду автоматично стандартизуються інструментом gofmt golint автоматично додатково перевіряє стиль. Інструменти та бібліотеки, що поширюються за допомогою Go, пропонують стандартні підходи до таких речей, як документація API Godoc [83], тестування тестування, building go build, управління пакунками get get і так далі
Go виконує застосування правил, що є рекомендаціями іншими мовами, наприклад, заборона циклічних залежностей, невикористаних змінних чи імпорт, а також неявні перетворення типів. Опущення певних функцій, наприклад , ярлики функціонального програмування, такі як map та C ++, спробуйте / нарешті блоки, як правило, заохочують певний чіткий, конкретний та імперативний стиль програмування. У перший день команда Go опублікувала колекцію Go idioms, а згодом також зібрала код r коментарі до eview, бесіди, офіційні повідомлення в блогах для викладання стилю Go та філософії кодування
Мовні інструменти
Go включає такий самий інструмент для налагодження, тестування та перевірки коду, як і багато мовних дистрибутивів. Дистрибуція Go включає серед інших інструментів ,
go build, який будує бінарні файли Go, використовуючи лише інформацію у самих вихідних файлах, не мають окремих файлів - тестування go, для тестування одиниць та мікропознань - go fmt, для форматування коду - go get, for вилучення та встановлення віддалених пакетів - перейти до ветеринара, статичного аналізатора, який шукає потенційні помилки в коді - запустіть, ярлик для побудови та виконання коду - godoc, для відображення документації або обслуговування її через HTTP
gorename , для перейменування змінних, функцій і так далі безпечним для типу способом - іти генерувати - стандартний спосіб викликати генератори коду. Це також включає підтримку профілювання та налагодження, інструментарій виконання, наприклад, відстежувати збирання сміття паузи та тестер стану гонок - Є екосистема Інструменти сторонніх розробників, які додають до стандартного розповсюдження, такі як gocode, який дозволяє автозаповнення коду в багатьох текстових редакторах, goimports члена команди Go, який автоматично додає / видаляє імпорт пакета, якщо потрібно, помилка перевірки, яка виявляє код, який може ненавмисне ігнорування помилок, і більше плагінів існує, щоб додати підтримку мови у широко використовуваних текстових редакторах, і принаймні один IDE, LiteIDE, позначається як "простий, з відкритим кодом, кросплатформенний ІД ID" [84]
Приклади
Hello world
Ось програма Hello world у програмі Go:
основний пакет - імпорт "fmt" - func main - приклад сумісності - Наступна проста програма демонструє особливості сумісництва Go реалізувати асинхронну програму. Вона запускає дві легкі потоки "goroutines":одна чекає, коли користувач введе якийсь текст, а інша реалізує тайм-аут. Оператор select чекає, коли будь-яка з цих гарантій відправить повідомлення в основний розпорядок роботи, і діє на перше повідомлення, що надійшло, пристосований приклад Chisnall [66]:152 - основний пакет
імпорт:"fmt" - "time" - func readwordch chan string - func timeoutt chan bool - func main
Проекти використання Go
Цей розділ занадто багато покладається на посилання на первинні джерела. Будь ласка, вдосконалюйте цей розділ, додавши вторинні або третинні джерела Листопад 2015 Дізнайтеся, як і коли видалити це шаблонне повідомлення
Деякі помітні програми з відкритим кодом у Go включають:
Docker, набір інструментів для розгортання контейнерів Linux - Doozer, послуга блокування керованого постачальника послуг хостингу Heroku [14] - geth Ethereum, спільна обчислювальна платформа світу - InfluxDB, база даних з відкритим кодом, спеціально для обробляти дані часового ряду з високою доступністю та високими вимогами до продуктивності - Juju, інструмент для оркестрування сервісів від Canonical, пакувальники Ubuntu Linux - Packer, інструмент для створення однакових зображень машин для декількох платформ з однієї конфігурації джерела
Snappy, менеджер пакунків для телефону Ubuntu, розроблений компанією Canonical
Syncthi ng, клієнт / серверне додаток для синхронізації файлів з відкритим кодом - Деякі помітні рамки з відкритим кодом з використанням Go:
Beego, високоефективна веб-рамка в Go, що використовується для веб-додатків та сервісів сервера [потрібна цитата]
Martini, пакет для веб-додатків / служб [потрібна цитата]
Gorilla, веб-інструментарій для Go [потрібне цитування]
Enduro / X ASG, проміжне програмне забезпечення кластера, сервер прикладних програм, розподілена транзакція та мультиобробна система для Перейти [потрібне цитування] - Інші помітні компанії та сайти, що використовують Go, як правило, разом з іншими мовами, не включають виключно:[85] [джерело, опубліковане самостійно] [86]
AeroFS, приватний постачальник хмарних файлів для синхронізації файлів, який перемістив деякі мікросервіси від Java to Go із значними покращеннями пам’яті пам’яті [87] - Чанго, програмна рекламна компанія використовує Go у своїх системах торгів у режимі реального часу [88] - Cloud Foundry, платформа як послуга [потрібна цитата]
CloudFlare, для проксі-кодування проксі-сервера Railgun, їх розподіленої служби DNS, a а також інструменти для криптографії, ведення журналів, обробки потоків та доступу до сайтів SPDY [89] [90] - CoreOS, операційна система на базі Linux, яка використовує контейнери Docker [91] - служби Couchbase, запитів та індексування в межах Сервер Couchbase [92] - Dropbox, перемістив деякі їх критичні компоненти з Python на Go [93]
Google, для багатьох проектів, зокрема, включаючи сервер завантаження dlgooglecom [94] [95] [96]
MercadoLibre, для декількох публічних API (потрібне цитування) - MongoDB, інструменти для адміністрування екземплярів MongoDB [97] - Netflix, для двох частин їх архітектури сервера [98]
Novartis, для внутрішньої системи інвентаризації [цитування потрібно]
Plugdj, інтерактивний веб-сайт для потокової соціальної музики в Інтернеті [99]
Реплікація, PaaS на основі Docker для створення корпоративного, інстальованого програмного забезпечення [100]
SendGrid, Boulder, Коларадо, транзакційна доставка електронної пошти та управління сервіс [101] - SoundCloud, для «десятки систем» [102] - Сплайс, для всього API бекенда та парсерів електронна онлайн-платформа музичної співпраці [103] - ThoughtWorks, деякі інструменти та програми навколо безперервної доставки та миттєвих повідомлень CoyIM [104]
Twitchtv, завдяки їхній системі чатів на основі IRC, перенесеній з Python [105]
Uber, для обробки великих обсягів запитів на основі географічних даних [106]
Zerodha, для пирінгу в режимі реального часу та потокової передачі ринкових даних [потрібне цитування]
Прийом
Початковий реліз Go почав багато дискусій
Система інтерфейсів, і навмисне упущення спадщини отримали високу оцінку Мікеле Сіміонато, який уподібнив ці мовні характеристики тим, які мають стандартний ML, назвавши це "прикро, що жодна популярна мова не слідувала [цьому] конкретному маршруту в дизайнерському просторі" [107]
Дейв Астелс в Engine Yard писав:[108]
Go дуже важко зануритися. Існує мінімальна кількість основних мовних понять, і синтаксис чистий і розроблений, щоб бути чітким і однозначним. Перехід все ще експериментальний і ще трохи шорсткі по краях - Ars Technica intervie одружений Роб Пайк, один з авторів програми Go, і запитав, для чого потрібна нова мова. Він відповів, що:[109]
Не достатньо було просто додати функції до існуючих мов програмування, тому що іноді можна отримати більше довгостроково відбираючи речі. Вони хотіли почати з нуля і переосмислити все [Але вони не хотіли] занадто сильно відхилятися від того, що розробники вже знали, тому що хотіли уникнути відчуження цільової аудиторії Go. Go був названий Мова програмування Рік за індексом співтовариства програмування TIOBE у перший рік 2009 року за те, що за останні 2 місяці після його впровадження в листопаді було більше 12-місячного зростання популярності, ніж будь-яка інша мова цього року, і до січня 2010 року досяг 13-го місця, [110], що перевершив усталені мови на зразок Паскаля. До червня 2015 року його рейтинг знизився до рівня 50-го в індексі, що ставило його нижче, ніж COBOL та Fortran [111] Але станом на вересень 2016 року [оновлення] його рейтинг збільшився до 19-го, що вказує значне зростання за популярністю та прийняттям [112]
Що стосується Go, Брюс Еккель заявив:[113]
Складність C ++ ще більше складності була додана в новому C ++, а наслідки, що впливають на продуктивність, вже не виправдані Усі обручі, через які програміст C ++ повинен був перескочити, щоб використовувати мову, сумісну з C, вже не мають сенсу - вони просто марно витрачають час і сили. Перехід має набагато більше сенсу для класу проблем, який C ++ був спочатку призначений вирішити
Оцінка мови та її gc впровадження 2011 року порівняно з C ++ GCC, Java та Scala інженером Google виявила, що:
Go пропонує цікаві мовні функції, які також дозволяють скласти стислі та стандартизовані позначення Компілятори для цієї мови ще незрілі, що відображається як у продуктивності, так і у бінарних розмірах. - R Hundt [114]
Оцінка отримала спростування від команди розробників Go Ian Lance Taylor, яка вдосконалила код Go для Папір Гундта не знав про наміри Іон опублікував свій код і каже, що його версія "ніколи не мала бути прикладом ідіоматичного чи ефективного". Потім Расс Кокс оптимізував код Go, а також код C ++, і змусив код Go працювати трохи швидше, ніж C ++ і більше, ніж на порядок швидше, ніж "оптимізований" код у роботі [115]
Суперечка з іменем - 10 листопада 2009 року, в день загального випуску цієї мови, Френсіс МакКабі, розробник програми Go! мовою програмування відзначте знак оклику, попросив змінити назву мови Google, щоб запобігти плутанині з його мовою, яку він витратив 10 років на розробку [116] МакКейб висловив занепокоєння, що "великий хлопець" закінчиться перепалом "над ним" , і ця стурбованість перегукується з більш ніж 120 розробниками, коментуючи офіційні теми Google, говорячи, що вони повинні змінити назву, деякі [117] навіть сказали, що проблема суперечить девізу Google:«Не будьте злими» [118] Проблема була закрита розробником Google 12 жовтня 2010 року зі спеціальним статусом "Невдалий" та таким коментарем:"Є багато обчислювальних продуктів та послуг з назвою Go. За 11 місяців після нашого виходу відбулося мінімальне плутанини двох мов". Дивіться також
Портал безкоштовного програмного забезпечення - Порівняння мов програмування - Dart, інша мова програмування Google - UFCS, спосіб «відкритих методів» іншими мовами - Примітки
^ Зазвичай точно такий результат і значення помилок має значення, відмінне від нульового значення типу; іноді і те, і інше, як коли читання чи запис може бути частково завершене, а іноді ні, як тоді, коли читання повертає 0 байт. Див. Проблема Semipredicate:Багатозначне повернення - ^ Запитання "Як отримати динамічну розсилку методів" та " Чому не існує успадкування типів "на мові FAQ [10]
Посилання - Ця стаття містить матеріали з офіційного підручника Go, який ліцензується за ліцензією Creative Commons Attribution 30. ^ ^" FAQ - The Go Мова програмування "Golangorg завантажено 2013-06-25
^" Історія випусків - Мова програмування Go "golangorg Отримано 19 жовтня 2016

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

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


Go (programming language)

Random Posts

Amorphous metal

Amorphous metal

An amorphous metal also known as metallic glass or glassy metal is a solid metallic material, usuall...
Arthur Lake (bishop)

Arthur Lake (bishop)

Arthur Lake September 1569 – 4 May 1626 was Bishop of Bath and Wells and a translator of the King Ja...
John Hawkins (author)

John Hawkins (author)

Sir John Hawkins 29 March 1719 – 21 May 1789 was an English author and friend of Dr Samuel Johnson a...
McDonnell Douglas MD-12

McDonnell Douglas MD-12

The McDonnell Douglas MD-12 was an aircraft design study undertaken by the McDonnell Douglas company...