- Go (язык программирования)
-
О языке программирования, появившемся в 2003 году, см.: Go! (язык программирования)
Go Класс языка: компилируемый, многопоточный, императивный, структурированный
Появился в: 2009 г.
Автор(ы): Роберт Гризмер, Роб Пайк и Кен Томпсон
Релиз: r60.3[1] (2011-10-17)
Типизация данных: Основные реализации: gc (8g, 6g, 5g), gccgo
Лицензия Сайт: Go — компилируемый, многопоточный язык программирования, разработанный компанией Google[2]. Первоначальная разработка Go началась в сентябре 2007 года, а его непосредственным проектированием занимались Роберт Гризмер, Роб Пайк и Кен Томпсон[3] занимавшиеся до этого проектом разработки операционной системы Inferno. Официально язык был представлен в ноябре 2009 года. На данный момент его поддержка осуществляется для операционных систем FreeBSD, Linux, Mac OS X и частично Windows.[4]
Содержание
Название
Следует отметить, что название языка, выбранное компанией Google, практически совпадает с названием языка программирования Go!, созданного Ф. Джи. МакКейбом и К. Л. Кларком в 2003 году.[5] Обсуждение названия ведётся на странице, посвящённой Go[5].
Описание
Синтаксис языка Go схож с синтаксисом языка Си, с отдельными элементами, заимствованными из Паскаля и скриптовых языков. В коде на Go очень мало точек с запятой — как точку с запятой Go трактует конец непустой строки (при определенных условиях). В результате этого в ряде случаев нельзя использовать перенос строки, например, в таком:
func g() { // НЕВЕРНО }
или таком
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 для указателей).
Объявления можно группировать:
var ( i int m float )
Язык Go поддерживает также автоматический вывод типов. Переменная может быть инициализирована при объявлении, её тип при этом можно не указывать — типом переменной становится тип присваиваемого ей выражения.
var v = *p
Внутри функции, короткий синтаксис присвоения переменным значения с автоматическим выводом типов напоминает обычное присваивание в Паскале.
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 отсутствуют такие возможности как:
- наследование типов (для похожей, но не идентичной, конструкции используется анонимное вложение типов),
- обобщённое программирование,
- использование утверждений
- переопределение методов[3].
Однако разработчики языка обдумывают возможность расширения языка средствами обобщённого программирования, в то время как в Часто задаваемых вопросах[3] по языку приводятся аргументы против использования утверждений, а наследование без указания типа, наоборот, отстаивается.
Многопоточность
Модель многопоточности Go была создана на основе CSP (англ.) Тони Хоара по типу предыдущих распараллеливаемых языков программирования Occam и Limbo,[3], но также присутствуют такие особенности Пи-исчисления, как канальная передача.
Go дает возможность создать новый поток выполнения программы (go-процедуру) с помощью ключевого слова go, которое запускает анонимную или именованную функцию в заново созданной go-процедуре (аналог сопрограмм). Все go-процедуры в рамках одного процесса используют общее адресное пространство, выполняясь над ОС-потоками, но без жесткой привязки к последним, что позволяет выполняющейся go-процедуре покидать поток с заблокированной go-процедурой (ждущей, например, отправки или приема сообщения из канала) и продолжать работу далее.
func server(i int) { for { print(i) sys.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) можно определить методы работы с ним.
type newInt 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. 6g (и сопутствующие ему инструменты, вместе известные под названием gc) написан на Си с применением yacc/Bison для парсера. Gccgo — ещё один компилятор Go с клиентской частью, написанной на C++, и рекурсивным парсером, совмещённым со стандартным бэк-эндом GCC[6]. Поддержка Go доступна в GCC 4.6.
Примеры
Ниже представлен пример программы «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) }
Примечания
Ссылки
- Домашняя страница языка Go (англ.)
- gomingw, Go MinGW Builds — версия для windows
- Сравнение Go с C++ (из официальной документации) (рус.)
- Вопросы и ответы по языку Go
- Learning Go (PDF), свободная Creative Commons книга о языке от Miek Gieben, доступны еженочные PDF-сборки и git-репозиторий с LATEX-исходниками.
- Язык программирования go: Часть 1. Краткий обзор и основы программирования, Дмитрий Выкочко, IBM developerWorks
- The Go Programming Language на YouTube
- A Tour of Go
- IRC : irc://irc.freenode.net/go-nuts на irc.freenode.net
- Подписка на рассылку : http://groups.google.com/group/golang-nuts
Основные языки программирования (список • сравнение • IDE • история • хронология) Используемые
в разработкеАда • АПЛ • Ассемблер • ActionScript • ABAP/4 • AutoIt • AWK • BASIC • C • Кобол • C++ • C# • Cω • Clarion • Clojure • ColdFusion • Common Lisp • D • dBase • Delphi • Eiffel • Erlang • Euphoria • F# • Форт • Фортран • Gambas • Go • Groovy • HAL/S • Haskell • Icon • Java • JavaScript • Limbo • Lua • MATLAB • Object Pascal • Objective-C • OCaml • Oz • Parser • Паскаль • Perl • PHP • PowerBASIC • PureBasic • Python • ПЛ/1 • Пролог • Ruby • Scala • Scheme • Smalltalk • SQL • PL/SQL • Tcl • Vala • Visual Basic • VB.NET
Академические IEC 61131-3 Instruction List • ST • FBD • Ladder Diagram (LD) • SFC
Прочие Эзотерические Визуального
программированияGoogle Inc. Председатель совета директоров: Эрик Шмидт • Директор, президент по технологиям и сооснователь: Сергей Брин • Главный исполнительный директор и сооснователь: Ларри Пейдж
Реклама Коммуникации ПО Платформы Account • Android • App Engine • Apps • Base • BigTable • Chrome OS • Co-op • Gears • Native Client • GFS • Health • Mashup • OpenSocial
Разрабатываемые
инструментыCode • Dart • Gadgets API • GData • Go • Googlebot • Guice • GWS • Highly Open Participation Contest • Image Labeler • KML • MapReduce • Mediabot • Pinyin • SketchUp Ruby • Sitemaps (index) • Summer of Code • TechTalks • Web Toolkit • Website Optimizer
Публикация Поиск (PageRank,
руководства)Тематические проекты См. также Поглощения • Цензура • Current • Критика • Earth Outreach • Foundation • Google China • Google.org • Googleplex • История • Hoaxes • I’m Feeling Lucky • Labs • Logo • Lunar X Prize • I/O • Список сервисов и инструментов • WiFi • Zeitgeist • «Бомбы» • Гуглизм
Годовой доход: US$16,59 млрд (▲56 % FY 2007) • Сотрудники: 24 400 (31 декабря 2010) • Биржевой тикер: (NASDAQ: GOOG) • Девиз: Don't be evil • Веб-сайт: google.com
Категории:- Появились в 2009 году
- Языки программирования по алфавиту
- Языки программирования семейства C
- Языки программирования, использующие фигурные скобки
- Многопоточные языки программирования
Wikimedia Foundation. 2010.