Go создавался с оглядкой назад, и его базовая комплектация действительно хорошо составлена: у него есть сборка мусора, пакеты, функции первого класса, лексическая область видимости, интерфейс системных вызовов и неизменяемые строки, текст которых обычно кодируется в UTF-8. Но он имеет сравнительно мало фич и вряд ли будет увеличивать их количество. Например, у него нет неявных числовых преобразований, нет конструкторов или деструкторов, нет перегрузки операторов, нет значений параметров по умолчанию, нет наследования, нет дженериков, нет исключений, нет макросов, нет аннотаций функций и нет локального хранилища потока.
Перед прочтением: Выше приведен отрывок из книги Алан А. А. Донована и Брайана В. Кернигана «Язык программирования Go». страница XIV. Пункты, упомянутые ниже, являются кратким и несколько неполным объяснением терминов, используемых при проектировании языка программирования. Я попытался объяснить все концепции с точки зрения программирования на Go. Все пункты, упомянутые ниже, не моего авторства, они взяты из других выдержек. Я никоим образом не защищаю Go или любой другой язык.
Теперь же мы попытаемся понять каждый термин вкратце. Для новичка в общем программировании знание этих терминов очень важно. Смысл всех этих понятий применим в каждом языке программирования. Эти термины могут помочь вам различать разные языки на фундаментальном уровне.
Элементы, которые есть в Go
Сборка мусора
Это механизм присутствует в любом языке программирования, который выполняет автоматическое управление памятью. Чтобы понять сборку мусора или управление памятью, сначала вам нужно понять, как работает сама память. При работе с языком программирования компилятор назначает различные пространства памяти в системе для хранения данных, например, создания переменной, цикла по массиву и т. д. Выделение и перераспределение памяти должно быть реализовано, чтобы сделать работу программы с памятью более эффективной.
В языке, подобном C, управление памятью осуществляется вручную. Если вы знакомы с C, вы знаете, что есть функция malloc, которая динамически распределяет память в системе. В языке высокого уровня, таком как JavaScript или Python, это распределение выполняется автоматически программой, известной как сборщик мусора. Как следует из названия, ее работа состоит в том, чтобы управлять памятью, выделять место, когда в нем есть необходимость, и освобождать выделенную память, когда ее больше нет. Go реализует сборку мусора, поэтому программисту не нужно беспокоиться об управлении памятью.
Пакеты
Пакетирование — это объединение всего исходного кода и ресурсов в один объект, называемый пакетом. Пакет программного обеспечения удобен во многих отношениях, таких как простая установка, совместное использование, добавление, отладка и т.д. Go имеет встроенную систему пакетов, которая объединяет документацию, двоичные файлы и файлы исходного кода. Целью пакетирования является возможность использования других программных проектов в вашем программном обеспечении без необходимости вручную копировать исходный код.
Функции первого класса
Функция первого класса — это функция, которая может обрабатываться как любая другая переменная, то есть она может быть назначена, возвращена, экспортирована, передана в качестве параметра и т. д. Посмотрите на следующий фрагмент, написанный на Go. Функция, которая печатает строку
hello world first class function
присваивается переменной a
. Переменная a ведет себя как фактическое значение в памяти, однако ее также можно вызывать как функцию, добавляя ()
в конце. Вы также можете видеть, что значение переменной a выводится так же, как и любая другая переменная. Это основная концепция функций первого класса.
package main
import (
"fmt"
)
func main() {
a := func() {
fmt.Println("hello world first class function")
}
a()
fmt.Printf("%T", a)
}
Лексическая область видимости
Область видимости в программе подобна блоку или области, в которой действует определение любой переменной/функции. Например, переменная, объявленная внутри функции, сохраняет свое значение только внутри этого функционального блока, то есть между фигурными скобками
{}
. Если вы попытаетесь получить доступ к значению такой переменной за пределами этого функционального блока, программа не сможет его найти.
package main
import “fmt”
func main() {
{
v := 1
{
fmt.Println(v)
}
fmt.Println(v)
}
fmt.Println(v)
// “undefined: v” compilation error
}
В приведенном фрагменте есть четыре области видимости. Первая — глобальная область, вторая — функция
main ()
, третья — первый блок внутри функции main
, и четвертая — область, где fmt.Println
вызывается впервые. Из трех Println
последний выдает ошибку компиляции. Это потому, что определение переменной v
доступно только в области три и четыре. Когда Println
вызывается с v
, переданным в качестве параметра, программа сначала ищет его определение в текущей области, когда она не может найти его, она перемещается наружу в области действия родителя и будет продолжать это делать, пока не найдет его определение. В этом и заключается лексическая область видимости — программа начинает искать определение переменных и функций из области, в которой они используются/вызываются, и перемещается наружу. В последней fmt.Println
программе не удалось найти определение v
в текущей или в каких-либо родительских областях, поэтому она выдает ошибку компиляции.
Интерфейс системных вызовов
Go поставляется с интерфейсом системных вызовов, который служит ссылкой на системные вызовы, доступные операционной системе. Например, открытие и чтение файла, ввод и вывод и т. д. Она перехватывает вызовы функций в API и вызывает необходимый системный вызов в операционной системе.
Неизменяемые строки
Хотя синтаксис Go схож с C, он имеет преимущество по сравнению с ним в виде неизменяемых (immutable) строк, которые кодируются в UTF-8. Т. е. программы, написанные на Go, могут формировать строки с помощью множества языков и символов. В простом смысле строки — это комбинация/массив/список символов в языках программирования. Поскольку строки формируются путем объединения символов, их состав может быть изменен. Символы могут быть добавлены, удалены, перемещены и т. д. Мы рассматриваем способ, который гарантирует неизменность строки после ее объявления. Концепция неизменяемых строк не нова, в экземплярах Python String объекты не могут быть видоизменены, в JavaScript тоже есть неизменяемые строки, а Ruby добавил Frozen String Literals в 2.3. Но, тем не менее, многие популярные языки, такие как C ++, PHP, Perl и т. д., не имеют неизменяемых строк.
Итак, на этом первая часть статьи подошла к концу. В ней были разобраны элементы, которые есть в Go, а о том чего в Go нет, поговорим во второй части, которая выйдет в ближайшие дни.
Комментариев нет:
Отправить комментарий