company_banner

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

Автор оригинала: Amrit Pandey
  • Перевод
Всем привет, в преддверии старта нового потока по курсу «Разработчик 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 нет, можно прочитать во второй части статьи.
OTUS. Онлайн-образование
521,05
Цифровые навыки от ведущих экспертов
Поделиться публикацией

Комментарии 9

    0
    Ну, не знаю.

    Может примеров хоть добавить. Причин?
    Почему строки неизменяемые например.
      +9
      Слишком много информации для одной статьи. Надо было растянуть на цикл из пяти, по отдельной статье на каждый пункт, и публиковать в течение месяца. И только после этого уже можно было бы переходить к недостаткам.

      Балуете вы читателей хабра, ох балуете.
        0
        Чисто IMHO: расписано очень поверхностно, в таком виде доступно для понимания людьми, хорошо знакомыми с этими идиомами. Но объем материала для такой аудитории явно очень маленький. С другой стороны для новичков недостаточно деталей и примеров, так что ценность для них тоже сомнительна. Возникает вопрос: для кого писалась статья?
          –3
          Однозначно в закладки. Как будет свободный часок, другой, обязательно почитаю.
            +1
            А ещё в Go есть такая замечательная штука, как Zero setup cross-compilation. Вряд ли хоть один компилируемый язык может похвастаться возможностью находясь в Linux просто так взять и собрать exe'шник под Windows, даже без настройки, просто парой команд. Тому же Rust'у для этого понадобится полноценная винда, ещё и с половиной MSVC в придачу.
              0

              Да ладно винда… Вот под Мак ровно так же — это да!

                0
                Тому же Rust'у для этого понадобится полноценная винда

                Настраивал кросскомпиляцию в linux -> windows:
                — Установил пакеты с mingw
                — прописал нужный таргет
                — скомпилировал

                Go кросскомпилирует без mingw?
                  0

                  Если код только на Go и не дёргается либ на С, то всё что нужно для кросскомпиляции — это Go SDK.
                  Тут Go на несколько порядков удобнее других языков. Не нужно тащить ни библиотек, ни виртуальных машин, ни интерпретаторов.

                    0
                    Go кросскомпилирует без mingw?


                    Не воспринимайте как выпад или что-то вроде, но да, Go кросскомпилирует без mingw. Просто для информации.

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое