Что есть и чего нет в Go. Часть 1 +3


Всем привет, в преддверии старта нового потока по курсу «Разработчик Golang» хотим поделиться с вами переводом интересной статьи, в первой части которой разбираются элементы, которые есть в Go. Поехали.



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




К сожалению, не доступен сервер mySQL