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

Go (язык программирования)
Go
Golang.png
Класс языка:

компилируемый, многопоточный, императивный, структурированный

Появился в:

2009 г.

Автор(ы):

Роберт Гризмер, Роб Пайк и Кен Томпсон

Релиз:

r60.3[1] (2011-10-17)

Типизация данных:

строгая, статическая

Основные реализации:

gc (8g, 6g, 5g), gccgo

Лицензия

BSD

Сайт:

http://golang.org

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] по языку приводятся аргументы против использования утверждений, а наследование без указания типа, наоборот, отстаивается.

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

Модель многопоточности 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)
}

Примечания

Ссылки


Wikimedia Foundation. 2010.

Игры ⚽ Поможем написать курсовую

Полезное


Смотреть что такое "Go (язык программирования)" в других словарях:

  • Язык программирования C++ — Эта статья о книге; о языке программирования см.: C++. Язык программирования C++ The C++ Programming Language Автор: Бьёрн Страуструп Язык оригинала: английский Оригинал издан: 1986 Издательство: Addison–Wesley …   Википедия

  • Язык программирования Java — разработанный корпорацией Sun Microsistems межплатформенный, интерпретируемый, объектно ориентированный язык программирования, используемый для создания приложений, работающих в под управлением веб браузера и характеризующихся высоким уровнем… …   Финансовый словарь

  • Язык программирования Паскаль — процедурно ориентированный язык программирования высокого уровня, предназначенный для широкого класса задач. Язык Паскаль считается языком структурного программирования. По английски: Pascal language См. также: Процедурно ориентированные языки… …   Финансовый словарь

  • Язык программирования — искусственный (формальный) язык, предназначенный для записи алгоритмов. Язык программирования задается своим описанием и реализуется в виде специальной программы: компилятора или интерпретатора. По английски: Programming language Синонимы:… …   Финансовый словарь

  • Язык программирования COBOL — язык программирования, предназначенный для решения экономических задач и задач обработки коммерческой информации. Язык COBOL отличается развитыми средствами работы с файлами и формой записи, приближенной к английскому языку. По английски: COBOL… …   Финансовый словарь

  • Язык программирования Лисп — универсальный язык программирования высокого уровня. Язык Лисп: относится к декларативным языкам функционального типа; предназначен для обработки символьных данных, представленных в виде списков. Основой языка являются функции и рекурсивные… …   Финансовый словарь

  • Язык программирования Ада — универсальный язык программирования: предназначенный для создания сложных систем; характеризующийся высокой степенью независимости от операционных систем; обеспечивающий поддержку средств параллельной обработки данных в реальном времени. По… …   Финансовый словарь

  • Язык программирования Алгол — язык программирования, предназначенный для решения численных задач. Программа на языке ALGOL имеет блочную структуру, позволяющую эффективно реализовывать механизмы динамического распределения памяти. По английски: ALGOL language См. также:… …   Финансовый словарь

  • Язык программирования Модула — алгоритмический язык, предназначенный для составления программ, работающих в реальном времени. В языке Модула используются: понятия модуля и процесса; средства программирования низкого уровня. Программа на языке Модула формируется из независимых… …   Финансовый словарь

  • Язык программирования Пролог — язык логического программирования, программа на котором состоит: из логических утверждений, образующих базу данных; и из правила вывода новых утверждений из известных. По английски: PROLOG language См. также: Декларативные языки программирования… …   Финансовый словарь

  • Язык программирования Форт — процедурно ориентированный язык программирования, предназначенный для эффективной работы с персональными системами. Форт близок к языку ассемблера. См. также: Процедурно ориентированные языки программирования Финансовый словарь Финам …   Финансовый словарь


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»