Язык Go от Google, Ford T с двигателем Ferrari
Google создала Go-язык, чтобы иметь возможность работать с современными многоядерными процессорами, что сложно с нынешними языками. Как всегда, новый язык отвечает на недовольство по отношению к нынешним языкам. В этом случае ему предназначалось заменить C++ для низкоуровневого программирования, чего ни Java, ни C # сделать не могут. Но это не значит, что он действительно используется для этого. Забавно, что создатели хотели сохранить синтаксис, к которому привыкли программисты, - С, но большинство используют Go, чтобы заменить Python !
Для его проектирования он обратился к нескольким ветеранам программирования, что объясняет почтенный синтаксис языка...

Современные функции и 40-летний синтаксис!
- Кен Томпсон. Соавтор Unix, создатель языка B, которому сменил C (Деннис Ричи).
- Роб Пайк, создал систему Plan 9 для Белла.
- Роберт Гриземер внес свой вклад в компилятор JavaScript V8 от Chrome и GCC.
Эти разработчики не имеют никакого отношения к C++, которая была создана Бьарне Струтструпом на базе C, что объясняет различные дизайнерские варианты, такие как композиция вместо наследства.
Цель Go - оставаться как можно ближе к языку C и при этом значительно повысить производительность, и заменить его.
Он черпает вдохновение из C, Java, Pascal, Python и даже повторяет особенности Script !
Google говорит нам в презентации :
«Мы утверждаем, что Go - современный язык».
И это правда, когда к его функциям, а не к синтаксису, датированному именно 1969 годом и языком В, и с заимствованиями у Паскаля (1970)!
Он используется в производстве в Google с мая 2010 года, но помимо того, что он очень эффективно заменяет C++, он также имеет тенденцию использоваться вместо Python и Ruby, потому что его скорость компиляции подходит для скриптинга, при этом производя быстрые исполняемые бинарники. Поэтому он может заменить все языки для программ командной строки.
Еще одна цитата автора, Роба Пайка:
Здесь главное, что наши программисты - Гоглеры, это не исследователи. Обычно они довольно молоды, свежеиспечены из школы, наверняка выучили Java, возможно, C или C++, а возможно, и Python. Они не способны понять блестящий язык, но мы хотим, чтобы они делали хорошие программы. Таким образом, язык, который мы им даем, должен быть легко понятен и легко принят.
Зачем использовать Go? Опыт пользователей...
Опыт довольно негативный у отдельных программистов, использовавших другие современные языки. Go в основном предназначен для команды, где повторяющееся добавление/замена программиста. Он позволяет быстро работать даже новичкам.
Его синтаксис и то, как он относится к объектам, предназначенным в основном для программирования на серверах в качестве замены Perl, Python или PHP. Он позволяет как быстро развиваться, так и выполнять велоскрипты.
Он с самого начала обладает конкурентными функциями и коллекционным гарбагом. Собирающий гараж обычно не подходит для выполнения ОС, драйверов, но специально оптимизирован для достижения перерывов менее 100 микро-волн!
Его можно использовать для создания серверного ПО и, например, для построения CMS и генерации HTML-страниц - домена, где он превосходит Python и Java.
Она проще C++, более адаптируема, чем Java, быстрее и безопаснее Python, имеет полную и хорошо продуманную библиотеку (с серверной стороны) и предоставляет необходимые услуги для веб-приложений, таких как WebSocket, клозуры.
И программы моментально компилируются, что облегчает разработку, как и точное описание возможных ошибок, в отличие от других языков вроде C++.
Синтаксис языка C
Синтаксис повышает производительность.
- Точка с запятой не требуется, кроме как разделять инструкции .
- map является столом спешки и является частью языка.
- Несколько потоков, которые взаимодействуют друг с другом .
- Переменные объявляются как в Pascal в виде:
var имя тип.
Ex: var x int ;
- разрыв и продолжение могут указать метку. В
- структуре коммутатора могут быть различные тесты, как в Script.
- Флажок может иметь несколько альтернативных вариантов:
поле 0, 1, 2 :
- Слайдер - это структура, которая берет часть списка и указывает на него.
- Команда go вызывает функцию, запустив другой поток.
- chan (канал) - канал связи между горутинами (которые являются функциями конкурирующих процессов).
- Формат строк UTF-8.
- Примитивами являются: bool, string, int, int8-64 аналогично для uint, byte, float32 и 64, complex64 и 128 .
Технология CSP (Communicating Sequential Processes) управляет связью между программами и помогает управлять многоядерными процессорами.
Вперед против Java
Java задумывался как язык для Сети и благодаря этому стал популярным. Он может работать на сервере или клиентском компьютере с помощью апплетов (они устарели).
Его главный интерес - очень обширная библиотека графического интерфейса.
Go как Java позволяет сразу тестировать развивающуюся программу или скрипт, но она производит двоичный код, поэтому быстрее и компактнее.
Go vs C++
Даже если он повторяет тот же синтаксис 70-х годов, Go упрощает программирование по сравнению с C++. Некоторые частые ошибки синтаксиса удаляются.
Многопоточная работа становится простой, с одной командой.
Коллекционный гараж облегчает управление памятью.
- Нет класса и наследства. Классы заменяются структурами и интерфейсами, близкими к объектам JavaScript. Объекты расширяются по составу, а не по наследству.
- Память управляется автоматически гарбагом-коллектором. В октябре 2016 года было объявлено, что новый GC обозначил перерывы менее 100 микро-секунд, поэтому пользователь был невидим.
- Указатели имеют фиксированный тип.
- Таблицы передаются по значениям, а не как указатели.
- Импорт пакетов, как в Java, а не заголовочных файлов, как в C.
- Без преобразования типов без использования функции.
- nil заменяет null.
- Символ указателя -> заменяется точкой.
- Приращения - и++ не могут использоваться в выражениях.
- Константы могут объявляться без типа.
- new - это функция, а не оператор.
- Go терпеть не может гениальность, из-за всех ее недостатков, считают авторы. (Ref: Esmeralda воображение).
Сравнение синтаксисов...
Го
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
C++
#include <stdio.h>
void main() {
puts("Hello, World!");
}
Го: два эквивалентных заявления.
var i : int = 10
var i = 10
C++
int i = 10;
Го
var str = "Hello in Go"
fmt.Println(str)
C++
string str = "Hello in C++";
puts(str);
Го
const a = 1
C++
const int a = 1;
Го
var b int = 2
var x, y, z int
var i, j, k int = 5, 10 , 20
b += x
C++
int b = 2;
int x, y, z;
int i = 5, j = 10, k = 20
b += x;
Го
x := 2
C++
int x = 2;
Го
if x < 1 {
fmt.Println("ok")
}
if x = mult(y, 100); x < 1000 {
fmt.Prinfln("ok")
}
C++
if(x < 10) {
puts("ok");
}
x = mult(y, 100);
if(x < 1000) {
puts("ok");
}
Go
switch x {
case "a":
fmt.Println("a")
case "b":
fallthrough
case "c":
fmt.Println("b ou c")
default:
fmt.Println("x")
}
C++ 11
switch(x) {
case "a":
puts("a");
break;
case "b":
case "c":
puts("b ou c");
break;
default:
puts("x");
}
Go
for i:= 0; i < 10; i++ {
fmt.Println(i)
}
C
int i;
for(i = 0; i <= 10; i++)
puts(i);
Go
var i = 0
for i < 10 {
fmt.Println(i)
i += 1
}
C
int i = 0;
while(i < 10) {
puts(i);
i += 1;
}
Go
for {
if condition {
break
}
}
C++
while(true) {
if(condition)
break;
}
Go
var arr = []int { 10,20,30 }
for i, v := range arr {
fmt.Println(v)
...
}
C++ version 11
int arr[] = { 10,20,30 };
for(x : arr) {
puts(x);
...
}
La syntaxe de Go pour déclarer une fonction reste simple, celle de Rust étant inutilement compliquée et abscon.
Si plusieurs arguments sont de même type, on déclare le type une seule fois. Mais cela reste des types statiques dans les deux langages et n'offre pas le multiple dispatch de Julia.
Go
func mult(x int, y int) int {
return x * y
}
C++
int mult(int x, int y) {
return (x * y);
}
Go
func ftuple(x int, y int) (int, int) {
return x * 2, y * 2
}
x, y = ftuple(10, 15)
C++
int[] ftuple(int x, int y) {
return { x * 2, y * 2 };
}
int z[] = ftuple(10, 15);
x = z[0]; y = z[0];
Go
type Point struct {
x int
y int
}
C++
struct Point {
int x;
int y;
}
Go
package main
import ("os";"flag";)
func main() {
var s = "Démonstration"
for i := 0; i < s; i++ {
fmt.Println(s[i])
}
}
C++
#include <stdio>
#include <string>
void main() {
string s = "Démonstration";
for(i : s) {
puts(i);
}
}
Sur le plan des bibliothèques, Go va directement à l'encontre de C++, non seulement il n'y a pas de fichiers d'en-têtes, mais on peut même inclure des modules externes directement depuis un site distant, car toute l'information pour l'intégration est stockée dans les modules.
En général cela facilite la distribution des programmes, mais cela à des inconvénients. Les modules importés directement cessent d'être compatibles et obligent à réécrire les logiciels...
Polémique au sujet du nom
Lors du lancement public du langage, un ticket a été créé sur le forum du langage avec pour code d'identification issue 9.
L'auteur d'un langage totalement inconnu clame que le nom Go est déjà celui de son propre langage. Le fait est qu'un livre a été écrit sur celui-ci, sous le titre Let's Go!
Mais ce langage s'appelle Go! et non pas go, et le mot Go appartient au domaine public: il s'agit d'un jeu de tableau chinois qui existe depuis plusieurs milliers d'années! (Et aussi le verbe "aller" en anglais).
Sites et outils pour Go