Go | это... Что такое Go? (original) (raw)

У этого термина существуют и другие значения, см. Го (значения).

Go

Golang.png
Класс языка: многопоточный, императивный, структурированный
Тип исполнения: компилируемый
Появился в: 2009
Автор(ы): Роберт Гризмер, Роб Пайк и Кен Томпсон
Релиз: 1.0.3 (23 сентября 2012)
Типизация данных: строгая, статическая, с выводом типов
Основные реализации: gc (8g, 6g, 5g), gccgo
Испытал влияние: Си, Python, Oberon, Limbo
Лицензия BSD
Сайт: golang.org, Go на Google Code

Goкомпилируемый, многопоточный язык программирования, разработанный компанией Google[1]. Первоначальная разработка Go началась в сентябре 2007 года, а его непосредственным проектированием занимались Роберт Гризмер, Роб Пайк и Кен Томпсон[2] занимавшиеся до этого проектом разработки операционной системы Inferno. Официально язык был представлен в ноябре 2009 года. На данный момент его поддержка осуществляется для операционных систем FreeBSD, OpenBSD, Linux, Mac OS X, Windows.[3]

Содержание

Название

Следует отметить, что название языка, выбранное компанией Google, практически совпадает с названием языка программирования Go!, созданного Ф. Джи. МакКейбом и К. Л. Кларком в 2003 году.[4] Обсуждение названия ведётся на странице, посвящённой Go[4].

Описание

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

или таком

if x { } else { // НЕВЕРНО }

Синтаксис объявления типа, в основном, решён в духе Паскаля.

//Go C++ var v1 int // int v1; var v2 string // const std::string v2; (примерно) var v3 [10]int // int v3[10]; var v4 []int // int* v4; (примерно) var v5 struct { f int } // struct { int f; } v5; var v6 int // int v6; (но нет арифметики для указателей) var v7 map[string]int // unordered_map* v7; (примерно) var v8 func(a int) int // int (*v8)(int a);

При объявлении переменные инициализируются на нулевое значение для данного типа (0 для int, пустая строка для string, nil для указателей).

Объявления можно группировать:

Язык Go поддерживает также автоматический вывод типов. Переменная может быть инициализирована при объявлении, её тип при этом можно не указывать — типом переменной становится тип присваиваемого ей выражения.

Внутри функции, короткий синтаксис присвоения переменным значения с автоматическим выводом типов напоминает обычное присваивание в Паскале.

v1 := v2 // аналог var v1 = v2

Go допускает множественные присваивания, выполняемые параллельно:

i, j = j, i // Поменять местами значения i и j.

Аргументы функций и методов объявляются таким образом:

func f(i, j, k int, s, t string) string { }

Функции могут возвращать несколько значений; типы таких значений заключаются в скобки:

func f(a, b int) (int, string) { return a+b, "сложение" }

Результаты функций так же могут быть именованы:

func incTwo(a, b int) (c, d int) { c = a+1 d = b+1 return }

Несколько значений, возвращаемых функциями, присваиваются переменным их перечислением через запятую:

first, second := incTwo(1, 2) // first = 2, second = 3

Прочие синтаксические различия заключаются в отсутствии круглых скобок для условных конструкций for и if.

Язык поддерживает сборку мусора (garbage collection), ассоциативные массивы и строки.

В Go отсутствуют такие возможности как:

Однако разработчики языка обдумывают возможность расширения языка средствами обобщённого программирования, в то время как в Часто задаваемых вопросах[2] по языку приводятся аргументы против использования утверждений, а наследование без указания типа, наоборот, отстаивается.

Многопоточность

Модель многопоточности Go была создана на основе CSP (англ.) Тони Хоара по типу предыдущих распараллеливаемых языков программирования Occam и Limbo,[2], но также присутствуют такие особенности Пи-исчисления, как канальная передача.

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

func server(i int) { for { print(i) time.Sleep(10) } } go server(1) go server(2)

В выражении go можно использовать замыкания.

var g int go func(i int) { s := 0 for j := 0; j < i; j++ { s += j } g = s }(1000)

Для связи между go-процедурами используются каналы (встроенный тип chan), через которые можно передавать любые значения. Для передачи значения в канал используется <- в качестве бинарного оператора, для получения сообщения из канала — <- в качестве унарного оператора.

Go и объектно-ориентированное программирование

Ключевое слово class в Go отсутствует, для любого именованного типа (включая структуры и базовые типы вроде int) можно определить методы работы с ним.

Определение метода отличается от обычного определения функции тем, что указывается получатель англ. receiver (похож на указатель this в методе класса C++).

type myType struct { i int } func (p *myType) get() int { return p.i } func (p *myType) set(i int) { p.i = i }

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

type myInterface interface { get() int set(i int) }

Объявленный выше тип myType реализует интерфейс myInterface, хотя это нигде не указано явно.

Такой подход к наследованию соответствует некоторым практическим тенденциям современного программирования. Так в знаменитой книге «банды четырёх» (Эрих Гамма и др.) о паттернах проектирования, в частности, написано:

Динамическая поддержка объектно-ориентированного программирования для Go осуществлена с помощью проекта GOOP[5].

Реализации

На данный момент существуют два компилятора Go:

Примеры

Ниже представлен пример программы «Hello, World!» на языке Go.

package main

import "fmt"

func main() { fmt.Println("Hello, World!") }

Пример реализации команды Unix echo:

package main

import ( "os" "flag" // парсер параметров командной строки )

var omitNewLine = flag.Bool("n", false, "не печатать знак новой строки")

const ( Space = " " NewLine = "\n" )

func main() { flag.Parse() // Сканирование списка аргументов и установка флагов var s string for i := 0; i < flag.NArg(); i++ { if i > 0 { s += Space } s += flag.Arg(i) } if !*omitNewLine { s += NewLine } os.Stdout.WriteString(s) }

Примечания

  1. Google-go-language
  2. 1 2 3 4 Language Design FAQ
  3. Getting Started — The Go Programming Language
  4. 1 2 Сообщение о конфликте имён в системе отслеживания ошибок
  5. Язык программирования Go от Google и 30 способов сделать его лучше//High Load Web
  6. Go FAQ: Implementation

Ссылки

Просмотр этого шаблона Основные языки программирования (сравнениеIDEисторияхронология)
Используемыев разработке АдаAPLЯзык ассемблераActionScriptABAP/4AutoItAWKБейсикСиКоболC++C#ClarionClojureColdFusionCommon LispDdBaseDelphiEiffelErlangEuphoriaF#ФортФортранGambasGoGroovy • HAL/S • HaskellIconJavaJavaScriptLimboLuaМодула-3Object PascalObjective-COCamlOzParserПаскальКомпонентный ПаскальPerlPHPPowerBASICPythonПЛ/1ПрологRubyScalaSchemeSmalltalkSQLPL/SQLTclValaVisual Basic (.NET)
Академические AgdaCleanCurryЛогоMLРЕФАЛСимулаОберон
IEC 61131-3 Instruction ListSTFBDLadder Diagram (LD) • SFC
Прочие АлголАлгол 68Модула-2МирандаHope
Эзотерические HQ9+/HQ9++ • INTERCALBrainfuck • Brainfork • BefungeMalbolgePietSpoonUnlambdaWhitespaceFALSELOLCODE
Визуальные G (LabVIEW) • Microsoft VPLSikuliVisSimАлисаДРАКОНСкретч
Просмотр этого шаблона Google Inc.
Председатель совета директоров: Эрик ШмидтДиректор, президент по технологиям и сооснователь: Сергей БринГлавный исполнительный директор и сооснователь: Ларри Пейдж
Реклама Adscape • AdSense • Advertising Professional • AdWordsAnalyticsCheckout • Click-to-Call • DoubleClick • Insights for Search • TrendsWalletGoogle Университет
Коммуникации Google+AnswersBuzzCalendar • Dodgeball • Friend ConnectGmail (история • интерфейс) • Groups • Joga Bonito • OrkutPanoramioPicasaВопросы и ответыReaderTalkTranslateVoiceWave
ПО Browser SyncChromeChromiumDesktopEarthGadgetsGoggles • Lively • Gmail Mobile • PackPicasa • Picnik • SketchUpTalkToolbarUpdaterWeb Accelerator
Платформы Account • AndroidApp EngineAppsBaseBigTableChrome OS • Co-op • GearsNative ClientGFSHealth • Mashup • OpenSocial
Разрабатываемыеинструменты CodeDart • Gadgets API • GData • GoGooglebotGuiceGWS • Highly Open Participation Contest • Image Labeler • KMLMapReduce • Mediabot • Pinyin • SketchUp Ruby • Sitemaps (index) • Summer of Code • TechTalks • Web Toolkit • Website Optimizer
Публикация Alerts • Blogger • Bookmarks • DocsFeedBurneriGoogleJaikuKnol • Library Project • Map Maker • Mashup Editor • Notebook • Page Creator • Sites • Video Marketplace • YouTubeДиск
Поиск (PageRank,руководства) Appliance • Audio • BooksCodeDesktop • GOOG-411 • Images • Maps (Mars • Moon • Ocean • SkyStreet View) • News • Patents • Products • Scholar • SearchWiki • UsenetVideoWeb
Тематические проекты Finance
См. также Поглощения • Цензура • Current • Критика • Earth Outreach • Foundation (Google.org) • Google China • GoogleplexИстория • Hoaxes • I’m Feeling LuckyLabs • Logo • Lunar X Prize • I/O • Список сервисов и инструментов • WiFi • Zeitgeist • «Бомбы»Гуглизм