Go — Обзор
Go — это язык общего назначения, разработанный с учетом системного программирования. Первоначально он был разработан в Google в 2007 году Робертом Гриземером, Робом Пайком и Кеном Томпсоном. Он строго и статически типизирован, обеспечивает встроенную поддержку сборки мусора и поддерживает параллельное программирование.
Программы построены с использованием пакетов, для эффективного управления зависимостями. Реализации программирования Go используют традиционную модель компиляции и компоновки для создания исполняемых двоичных файлов. Язык программирования Go был объявлен в ноябре 2009 года и используется в некоторых производственных системах Google.
Особенности программирования Go
Наиболее важные функции программирования Go перечислены ниже —
-
Поддержка среды, принимающей шаблоны, подобные динамическим языкам. Например, вывод типа (x: = 0 — допустимое объявление переменной x типа int)
-
Время компиляции быстро.
-
Встроенная поддержка параллелизма: облегченные процессы (через процедуры go), каналы, оператор выбора.
-
Программы Go просты, лаконичны и безопасны.
-
Поддержка интерфейсов и встраивание типов.
-
Создание статически связанных собственных двоичных файлов без внешних зависимостей.
Поддержка среды, принимающей шаблоны, подобные динамическим языкам. Например, вывод типа (x: = 0 — допустимое объявление переменной x типа int)
Время компиляции быстро.
Встроенная поддержка параллелизма: облегченные процессы (через процедуры go), каналы, оператор выбора.
Программы Go просты, лаконичны и безопасны.
Поддержка интерфейсов и встраивание типов.
Создание статически связанных собственных двоичных файлов без внешних зависимостей.
Особенности исключены преднамеренно
Чтобы язык был простым и лаконичным, в Go опущены следующие функции, обычно доступные на других похожих языках.
-
Поддержка наследования типов
-
Поддержка перегрузки метода или оператора
-
Поддержка циклических зависимостей между пакетами
-
Поддержка арифметики указателей
-
Поддержка утверждений
-
Поддержка общего программирования
Поддержка наследования типов
Поддержка перегрузки метода или оператора
Поддержка циклических зависимостей между пакетами
Поддержка арифметики указателей
Поддержка утверждений
Поддержка общего программирования
Перейти Программы
Программа Go может иметь длину от 3 до миллионов строк, и ее следует записать в один или несколько текстовых файлов с расширением «.go». Например, hello.go.
Вы можете использовать «vi», «vim» или любой другой текстовый редактор, чтобы записать вашу программу Go в файл.
Go — Настройка среды
Настройка локальной среды
Если вы все еще хотите настроить свою среду программирования на язык Go, вам потребуются следующие два программного обеспечения, доступных на вашем компьютере:
- Текстовый редактор
- Go компилятор
Текстовый редактор
Вам потребуется текстовый редактор для ввода ваших программ. Примерами текстовых редакторов являются Блокнот Windows, команда редактирования ОС, Brief, Epsilon, EMACS и vim или vi.
Название и версия текстовых редакторов могут различаться в разных операционных системах. Например, Блокнот используется в Windows, а vim или vi используется в Windows, а также в Linux или UNIX.
Файлы, которые вы создаете в текстовом редакторе, называются исходными файлами . Они содержат исходный код программы. Исходные файлы для программ Go обычно называются с расширением «.go» .
Перед началом программирования убедитесь, что у вас есть текстовый редактор, и у вас достаточно опыта, чтобы написать компьютерную программу, сохранить ее в файле, скомпилировать и, наконец, выполнить.
Компилятор Go
Исходный код, написанный в исходном файле, является удобочитаемым исходным кодом для вашей программы. Он должен быть скомпилирован и превращен в машинный язык, чтобы ваш процессор мог фактически выполнить программу согласно приведенным инструкциям. Компилятор языка программирования Go компилирует исходный код в конечную исполняемую программу.
Дистрибутив Go поставляется в виде двоичного кода, устанавливаемого для FreeBSD (версия 8 и выше), Linux, Mac OS X (Snow Leopard и выше) и операционных систем Windows с 32-битной (386) и 64-битной (amd64) процессорной архитектурой x86.
В следующем разделе объясняется, как установить бинарный дистрибутив Go на различные ОС.
Скачать Go Archive
Загрузите последнюю версию установочного архивного файла Go с сайта Go Downloads . Следующая версия используется в этом руководстве: go1.4.windows-amd64.msi .
Он копируется в папку C: \> go.
Операционные системы | Название архива |
---|---|
Windows | go1.4.windows-amd64.msi |
Linux | go1.4.linux-amd64.tar.gz |
макинтош | go1.4.darwin-amd64-osx10.8.pkg |
FreeBSD | go1.4.freebsd-amd64.tar.gz |
Установка в UNIX / Linux / Mac OS X и FreeBSD
Извлеките загруженный архив в папку / usr / local, создав дерево Go в / usr / local / go. Например —
tar -C / usr / local -xzf go1.4.linux-amd64.tar.gz
Добавьте / usr / local / go / bin в переменную окружения PATH.
Операционные системы | Выход |
---|---|
Linux | экспорт PATH = $ PATH: / usr / local / go / bin |
макинтош | экспорт PATH = $ PATH: / usr / local / go / bin |
FreeBSD | экспорт PATH = $ PATH: / usr / local / go / bin |
Установка на Windows
Используйте файл MSI и следуйте инструкциям для установки инструментов Go. По умолчанию установщик использует дистрибутив Go в каталоге c: \ Go. Установщик должен установить каталог c: \ Go \ bin в переменной окружения PATH Window. Перезапустите все открытые команды, чтобы изменения вступили в силу.
Проверка установки
Создайте файл go с именем test.go в C: \> Go_WorkSpace .
Файл: test.go
package main import "fmt" func main() { fmt.Println("Hello, World!") }
Теперь запустите test.go, чтобы увидеть результат —
C:\Go_WorkSpace>go run test.go
Выход
Hello, World!
Go — Структура программы
Прежде чем мы изучим основные строительные блоки языка программирования Go, давайте сначала обсудим минимальную структуру программ Go, чтобы мы могли взять ее в качестве справочного материала в последующих главах.
Пример Hello World
Программа Go в основном состоит из следующих частей —
- Декларация пакета
- Импортные пакеты
- функции
- переменные
- Заявления и выражения
- Комментарии
Давайте посмотрим на простой код, который будет печатать слова «Hello World» —
package main import "fmt" func main() { /* This is my first sample program. */ fmt.Println("Hello, World!") }
Давайте посмотрим на различные части вышеуказанной программы —
-
Первая строка основного пакета программы определяет имя пакета, в котором должна находиться эта программа. Это обязательное утверждение, поскольку программы Go запускаются в пакетах. Основной пакет является отправной точкой для запуска программы. С каждым пакетом связан путь и имя.
-
Следующая строка import «fmt» — это команда препроцессора, которая указывает компилятору Go включать файлы, лежащие в пакете fmt.
-
Следующая строка func main () — это основная функция, с которой начинается выполнение программы.
-
Следующая строка /*…*/ игнорируется компилятором, и она добавляет комментарии в программу. Комментарии также представлены с использованием // похожих на комментарии Java или C ++.
-
Следующая строка fmt.Println (…) — это еще одна функция, доступная в Go, которая вызывает сообщение «Hello, World!» быть отображенным на экране. Здесь пакет fmt экспортировал метод Println, который используется для отображения сообщения на экране.
-
Обратите внимание на заглавную P метода Println. На языке Go имя экспортируется, если оно начинается с заглавной буквы. Экспортируется означает, что функция или переменная / константа доступна для импортера соответствующего пакета.
Первая строка основного пакета программы определяет имя пакета, в котором должна находиться эта программа. Это обязательное утверждение, поскольку программы Go запускаются в пакетах. Основной пакет является отправной точкой для запуска программы. С каждым пакетом связан путь и имя.
Следующая строка import «fmt» — это команда препроцессора, которая указывает компилятору Go включать файлы, лежащие в пакете fmt.
Следующая строка func main () — это основная функция, с которой начинается выполнение программы.
Следующая строка /*…*/ игнорируется компилятором, и она добавляет комментарии в программу. Комментарии также представлены с использованием // похожих на комментарии Java или C ++.
Следующая строка fmt.Println (…) — это еще одна функция, доступная в Go, которая вызывает сообщение «Hello, World!» быть отображенным на экране. Здесь пакет fmt экспортировал метод Println, который используется для отображения сообщения на экране.
Обратите внимание на заглавную P метода Println. На языке Go имя экспортируется, если оно начинается с заглавной буквы. Экспортируется означает, что функция или переменная / константа доступна для импортера соответствующего пакета.
Выполнение программы Go
Давайте обсудим, как сохранить исходный код в файле, скомпилировать его и, наконец, выполнить программу. Пожалуйста, следуйте инструкциям ниже
-
Откройте текстовый редактор и добавьте вышеупомянутый код.
-
Сохраните файл как hello.go
-
Откройте командную строку.
-
Перейдите в каталог, где вы сохранили файл.
-
Введите go run hello.go и нажмите enter, чтобы запустить свой код.
-
Если в вашем коде нет ошибок, вы увидите «Hello World!» напечатано на экране.
Откройте текстовый редактор и добавьте вышеупомянутый код.
Сохраните файл как hello.go
Откройте командную строку.
Перейдите в каталог, где вы сохранили файл.
Введите go run hello.go и нажмите enter, чтобы запустить свой код.
Если в вашем коде нет ошибок, вы увидите «Hello World!» напечатано на экране.
$ go run hello.go Hello, World!
Убедитесь, что компилятор Go находится на вашем пути и вы запускаете его в каталоге, содержащем исходный файл hello.go.
Go — основной синтаксис
Мы обсудили базовую структуру программы Go в предыдущей главе. Теперь будет легко понять другие основные строительные блоки языка программирования Go.
Жетоны в го
Программа Go состоит из различных токенов. Токен является ключевым словом, идентификатором, константой, строковым литералом или символом. Например, следующий оператор Go состоит из шести токенов —
fmt.Println("Hello, World!")
Отдельные токены —
fmt . Println ( "Hello, World!" )
Разделитель строк
В программе Go ключ разделителя строк является разделителем операторов. То есть отдельным операторам не требуется специальный разделитель, такой как «;» в C. Компилятор Go внутренне помещает «;» в качестве разделителя операторов, чтобы указать конец одного логического объекта.
Например, взгляните на следующие утверждения:
fmt.Println("Hello, World!") fmt.Println("I am in Go Programming World!")
Комментарии
Комментарии подобны текстам помощи в вашей программе Go, и они игнорируются компилятором. Они начинаются с / * и заканчиваются символами * /, как показано ниже —
/* my first program in Go */
Вы не можете иметь комментарии в комментариях, и они не встречаются в строке или символьных литералах.
Идентификаторы
Идентификатор Go — это имя, используемое для идентификации переменной, функции или любого другого определенного пользователем элемента. Идентификатор начинается с буквы от A до Z или от a до z или подчеркивания _, за которым следуют ноль или более букв, подчеркиваний и цифр (от 0 до 9).
идентификатор = буква {буква | unicode_digit}.
Go не допускает использование знаков препинания, таких как @, $ и% в идентификаторах. Go — это язык программирования с учетом регистра . Таким образом, рабочая сила и рабочая сила — это два разных идентификатора в Go. Вот несколько примеров допустимых идентификаторов:
mahesh kumar abc move_name a_123 myname50 _temp j a23b9 retVal
Ключевые слова
В следующем списке показаны зарезервированные слова в Go. Эти зарезервированные слова не могут использоваться как константы или переменные или любые другие имена идентификаторов.
перерыв | дефолт | FUNC | интерфейс | Выбрать |
дело | откладывать | Идти | карта | Struct |
чан | еще | Идти к | пакет | переключатель |
Const | провалиться | если | спектр | Тип |
Продолжить | за | Импортировать | вернуть | Var |
Пробелы в Го
Пробел — это термин, используемый в Go для описания пробелов, вкладок, символов новой строки и комментариев. Строка, содержащая только пробел, возможно, с комментарием, называется пустой строкой, и компилятор Go полностью игнорирует ее.
Пробелы отделяют одну часть оператора от другой и позволяют компилятору определить, где заканчивается один элемент в выражении, например int, и начинается следующий элемент. Поэтому в следующем утверждении —
var age int;
Должен быть хотя бы один символ пробела (обычно пробел) между int и age, чтобы компилятор мог их различать. С другой стороны, в следующем утверждении —
fruit = apples + oranges; // get the total fruit
Никаких пробельных символов не требуется между фруктами и = или между = и яблоками, хотя вы можете включить некоторые из них, если хотите, чтобы они были удобочитаемыми.
Go — Типы данных
В языке программирования Go типы данных относятся к обширной системе, используемой для объявления переменных или функций различных типов. Тип переменной определяет, сколько места она занимает в хранилище и как интерпретируется сохраненный битовый шаблон.
Типы в Go можно классифицировать следующим образом:
Sr.No. | Типы и описание |
---|---|
1 |
Булевы типы Они являются логическими типами и состоят из двух предопределенных констант: (a) true (b) false |
2 |
Числовые типы Они снова являются арифметическими типами и представляют а) целочисленные типы или б) значения с плавающей запятой по всей программе. |
3 |
Типы строк Строковый тип представляет собой набор строковых значений. Его значение представляет собой последовательность байтов. Строки являются неизменяемыми типами, которые создаются после того, как невозможно изменить содержимое строки. Предварительно объявленный тип строки — строка. |
4 |
Производные типы Они включают (a) типы указателей, (b) типы массивов, (c) типы структур, (d) типы объединений и (e) типы функций f) типы срезов g) типы интерфейсов h) типы карт i) типы каналов |
Булевы типы
Они являются логическими типами и состоят из двух предопределенных констант: (a) true (b) false
Числовые типы
Они снова являются арифметическими типами и представляют а) целочисленные типы или б) значения с плавающей запятой по всей программе.
Типы строк
Строковый тип представляет собой набор строковых значений. Его значение представляет собой последовательность байтов. Строки являются неизменяемыми типами, которые создаются после того, как невозможно изменить содержимое строки. Предварительно объявленный тип строки — строка.
Производные типы
Они включают (a) типы указателей, (b) типы массивов, (c) типы структур, (d) типы объединений и (e) типы функций f) типы срезов g) типы интерфейсов h) типы карт i) типы каналов
Типы массивов и типы структур совместно называются агрегатными типами . Тип функции определяет набор всех функций с одинаковыми параметрами и типами результатов. Мы обсудим основные типы в следующем разделе, тогда как другие типы будут рассмотрены в следующих главах.
Целочисленные типы
Предопределенные архитектурно-независимые целочисленные типы:
Sr.No. | Типы и описание |
---|---|
1 |
uint8 8-разрядные целые числа без знака (от 0 до 255) |
2 |
uint16 16-разрядные целые числа без знака (от 0 до 65535) |
3 |
uint32 32-разрядные целые числа без знака (от 0 до 4294967295) |
4 |
uint64 64-разрядные целые числа без знака (от 0 до 18446744073709551615) |
5 |
int8 8-разрядные целые числа со знаком (от -128 до 127) |
6 |
int16 16-разрядные целые числа со знаком (от -32768 до 32767) |
7 |
int32 32-разрядные целые числа со знаком (от -2147483648 до 2147483647) |
8 |
int64 64-разрядные целые числа со знаком (от -9223372036854775808 до 9223372036854775807) |
uint8
8-разрядные целые числа без знака (от 0 до 255)
uint16
16-разрядные целые числа без знака (от 0 до 65535)
uint32
32-разрядные целые числа без знака (от 0 до 4294967295)
uint64
64-разрядные целые числа без знака (от 0 до 18446744073709551615)
int8
8-разрядные целые числа со знаком (от -128 до 127)
int16
16-разрядные целые числа со знаком (от -32768 до 32767)
int32
32-разрядные целые числа со знаком (от -2147483648 до 2147483647)
int64
64-разрядные целые числа со знаком (от -9223372036854775808 до 9223372036854775807)
Плавающие Типы
Предопределенные независимые от архитектуры типы:
Sr.No. | Типы и описание |
---|---|
1 |
float32 IEEE-754 32-битные числа с плавающей точкой |
2 |
float64 IEEE-754 64-битные числа с плавающей точкой |
3 |
complex64 Комплексные числа с вещественными и мнимыми частями типа float32 |
4 |
complex128 Комплексные числа с вещественными и мнимыми частями float64 |
float32
IEEE-754 32-битные числа с плавающей точкой
float64
IEEE-754 64-битные числа с плавающей точкой
complex64
Комплексные числа с вещественными и мнимыми частями типа float32
complex128
Комплексные числа с вещественными и мнимыми частями float64
Значение n-битного целого числа равно n битам и представляется с использованием двух арифметических операций с дополнением.
Другие числовые типы
Существует также набор числовых типов с размерами, зависящими от реализации —
Sr.No. | Типы и описание |
---|---|
1 |
байт такой же как уинт8 |
2 |
руна такой же как int32 |
3 |
UINT 32 или 64 бита |
4 |
ИНТ такой же размер, как уинт |
5 |
UIntPtr целое число без знака для хранения неинтерпретированных битов значения указателя |
байт
такой же как уинт8
руна
такой же как int32
UINT
32 или 64 бита
ИНТ
такой же размер, как уинт
UIntPtr
целое число без знака для хранения неинтерпретированных битов значения указателя
Go — переменные
Переменная — это не что иное, как имя, данное области памяти, которой могут манипулировать программы. Каждая переменная в Go имеет определенный тип, который определяет размер и расположение памяти переменной, диапазон значений, которые могут храниться в этой памяти, и набор операций, которые можно применять к переменной.
Имя переменной может состоять из букв, цифр и символа подчеркивания. Он должен начинаться либо с буквы, либо с подчеркивания. Прописные и строчные буквы различны, потому что Go чувствителен к регистру. Основываясь на базовых типах, описанных в предыдущей главе, будут следующие базовые типы переменных:
Sr.No | Тип и описание |
---|---|
1 |
байт Обычно один октет (один байт). Это тип байта. |
2 |
ИНТ Наиболее натуральный размер целого числа для машины. |
3 |
float32 Значение с плавающей запятой одинарной точности. |
байт
Обычно один октет (один байт). Это тип байта.
ИНТ
Наиболее натуральный размер целого числа для машины.
float32
Значение с плавающей запятой одинарной точности.
Язык программирования Go также позволяет определять различные другие типы переменных, такие как перечисление, указатель, массив, структура и объединение, которые мы обсудим в последующих главах. В этой главе мы сосредоточимся только на основных типах переменных.
Определение переменной в Go
Определение переменной сообщает компилятору, где и сколько памяти нужно создать для переменной. Определение переменной определяет тип данных и содержит список из одной или нескольких переменных этого типа следующим образом:
var variable_list optional_data_type;
Здесь, option_data_type — это допустимый тип данных Go, включая byte, int, float32, complex64, логический или любой пользовательский объект и т. Д., А variable_list может состоять из одного или нескольких имен идентификаторов, разделенных запятыми. Некоторые действительные объявления показаны здесь —
var i, j, k int; var c, ch byte; var f, salary float32; d = 42;
Оператор «var i, j, k;» объявляет и определяет переменные i, j и k; который инструктирует компилятор создавать переменные с именами i, j и k типа int.
Переменные могут быть инициализированы (им присвоено начальное значение) в их объявлении. Тип переменной автоматически определяется компилятором на основании значения, переданного ей. Инициализатор состоит из знака равенства, за которым следует постоянное выражение:
variable_name = value;
Например,
d = 3, f = 5; // declaration of d and f. Here d and f are int
Для определения без инициализатора: переменные со статической продолжительностью хранения неявно инициализируются значением nil (все байты имеют значение 0); начальное значение всех других переменных — нулевое значение их типа данных.
Объявление статического типа в Go
Объявление переменной статического типа обеспечивает компилятору гарантию, что имеется одна переменная с заданным типом и именем, так что компилятор может продолжить дальнейшую компиляцию, не требуя полной детализации переменной. Объявление переменной имеет смысл только во время компиляции, компилятору требуется фактическое объявление переменной во время компоновки программы.
пример
Попробуйте следующий пример, где переменная была объявлена с типом и инициализирована внутри основной функции —
package main import "fmt" func main() { var x float64 x = 20.0 fmt.Println(x) fmt.Printf("x is of type %T\n", x) }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
20 x is of type float64
Динамическое объявление типа / вывод типа в Go
Объявление переменной динамического типа требует, чтобы компилятор интерпретировал тип переменной на основе переданного ей значения. Компилятору не требуется, чтобы переменная статически имела тип в качестве необходимого требования.
пример
Попробуйте следующий пример, где переменные были объявлены без какого-либо типа. Обратите внимание, что в случае вывода типа мы инициализировали переменную y с помощью оператора: =, тогда как x инициализировали с помощью оператора =.
package main import "fmt" func main() { var x float64 = 20.0 y := 42 fmt.Println(x) fmt.Println(y) fmt.Printf("x is of type %T\n", x) fmt.Printf("y is of type %T\n", y) }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
20 42 x is of type float64 y is of type int
Объявление смешанной переменной в Go
Переменные разных типов могут быть объявлены за один раз, используя вывод типа.
пример
package main import "fmt" func main() { var a, b, c = 3, 4, "foo" fmt.Println(a) fmt.Println(b) fmt.Println(c) fmt.Printf("a is of type %T\n", a) fmt.Printf("b is of type %T\n", b) fmt.Printf("c is of type %T\n", c) }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
3 4 foo a is of type int b is of type int c is of type string
Lvalues и rvalues в го
В Go есть два вида выражений:
-
lvalue — Выражения, которые ссылаются на ячейку памяти, называются выражением «lvalue». Lvalue может отображаться как левая или правая сторона задания.
-
rvalue — термин rvalue относится к значению данных, которое хранится по некоторому адресу в памяти. Значение r — это выражение, которому не может быть присвоено значение, что означает, что значение r может появляться с правой, но не с левой стороны присвоения.
lvalue — Выражения, которые ссылаются на ячейку памяти, называются выражением «lvalue». Lvalue может отображаться как левая или правая сторона задания.
rvalue — термин rvalue относится к значению данных, которое хранится по некоторому адресу в памяти. Значение r — это выражение, которому не может быть присвоено значение, что означает, что значение r может появляться с правой, но не с левой стороны присвоения.
Переменные являются lvalues и могут отображаться в левой части назначения. Числовые литералы являются r-значениями, поэтому не могут быть назначены и не могут отображаться слева.
Следующее утверждение действительно:
x = 20.0
Следующее утверждение недопустимо. Это сгенерирует ошибку во время компиляции —
10 = 20
Go — Константы
Константы относятся к фиксированным значениям, которые программа не может изменить во время своего выполнения. Эти фиксированные значения также называются литералами .
Константы могут быть любого из основных типов данных, таких как целочисленная константа, плавающая константа, символьная константа или строковый литерал . Есть также константы перечисления.
Константы обрабатываются как обычные переменные, за исключением того, что их значения не могут быть изменены после их определения.
Целочисленные литералы
Целочисленный литерал может быть десятичной, восьмеричной или шестнадцатеричной константой. Префикс указывает основание или основание: 0x или 0X для шестнадцатеричного, 0 для восьмеричного и ничего для десятичного.
Целочисленный литерал также может иметь суффикс, который представляет собой комбинацию U и L для беззнакового и длинного соответственно. Суффикс может быть в верхнем или нижнем регистре и может быть в любом порядке.
Вот несколько примеров целочисленных литералов —
212 /* Legal */ 215u /* Legal */ 0xFeeL /* Legal */ 078 /* Illegal: 8 is not an octal digit */ 032UU /* Illegal: cannot repeat a suffix */
Ниже приведены другие примеры различных типов литералов Integer —
85 /* decimal */ 0213 /* octal */ 0x4b /* hexadecimal */ 30 /* int */ 30u /* unsigned int */ 30l /* long */ 30ul /* unsigned long */
Литералы с плавающей точкой
Литерал с плавающей точкой имеет целочисленную часть, десятичную точку, дробную часть и экспоненту. Вы можете представлять литералы с плавающей запятой в десятичной или экспоненциальной форме.
При представлении с использованием десятичной формы вы должны включать десятичную точку, экспоненту или оба, а при представлении с использованием экспоненциальной формы вы должны включать целую часть, дробную часть или оба. Подписанный показатель вводится через e или E.
Вот несколько примеров литералов с плавающей точкой —
3.14159 /* Legal */ 314159E-5L /* Legal */ 510E /* Illegal: incomplete exponent */ 210f /* Illegal: no decimal or exponent */ .e55 /* Illegal: missing integer or fraction */
Последовательность побега
Когда определенным символам предшествует обратная косая черта, они будут иметь особое значение в Go. Они известны как коды Escape-последовательности, которые используются для представления новой строки (\ n), табуляции (\ t), возврата и т. Д. Здесь у вас есть список некоторых из таких кодов Escape-последовательности:
Последовательность побега | Имея в виду |
---|---|
\\ | \ персонаж |
\» | ‘ персонаж |
\» | » персонаж |
\? | ? персонаж |
\ а | Оповещение или звонок |
\ б | возврат на одну позицию |
\ е | Форма подачи |
\ п | Новая линия |
\р | Возврат каретки |
\ т | Горизонтальная вкладка |
\ v | Вертикальная вкладка |
\ ооо | Восьмеричное число от одной до трех цифр |
ххх , , | Шестнадцатеричное число из одной или нескольких цифр |
В следующем примере показано, как использовать \ t в программе —
package main import "fmt" func main() { fmt.Printf("Hello\tWorld!") }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Hello World!
Строковые литералы в го
Строковые литералы или константы заключаются в двойные кавычки «». Строка содержит символы, похожие на символьные литералы: простые символы, escape-последовательности и универсальные символы.
Вы можете разбить длинную строку на несколько строк, используя строковые литералы и разделяя их пробелами.
Вот несколько примеров строковых литералов. Все три формы являются одинаковыми строками.
"hello, dear" "hello, \ dear" "hello, " "d" "ear"
Ключевое слово const
Вы можете использовать префикс const для объявления констант определенного типа следующим образом:
const variable type = value;
В следующем примере показано, как использовать ключевое слово const —
package main import "fmt" func main() { const LENGTH int = 10 const WIDTH int = 5 var area int area = LENGTH * WIDTH fmt.Printf("value of area : %d", area) }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
value of area : 50
Обратите внимание, что это хорошая практика программирования для определения констант в заглавных буквах.
Go — Операторы
Оператор — это символ, который указывает компилятору выполнять определенные математические или логические манипуляции. Язык Go богат встроенными операторами и предоставляет следующие типы операторов:
- Арифметические Операторы
- Операторы отношений
- Логические Операторы
- Битовые операторы
- Операторы присваивания
- Разные операторы
В этом руководстве один за другим объясняются арифметические, реляционные, логические, побитовые, присваивания и другие операторы.
Арифметические Операторы
В следующей таблице приведены все арифметические операторы, поддерживаемые языком Go. Предположим, что переменная A содержит 10, а переменная B содержит 20, тогда —
оператор | Описание | пример |
---|---|---|
+ | Добавляет два операнда | А + Б дает 30 |
— | Вычитает второй операнд из первого | A — B дает -10 |
* | Умножает оба операнда | A * B дает 200 |
/ | Делит числитель на знаменатель. | Б / А дает 2 |
% | Оператор модуля; дает остаток после целочисленного деления. | B% A дает 0 |
++ | Оператор приращения. Увеличивает целочисленное значение на единицу. | А ++ дает 11 |
— | Оператор декремента. Уменьшает целочисленное значение на единицу. | A— дает 9 |
Операторы отношений
В следующей таблице перечислены все реляционные операторы, поддерживаемые языком Go. Предположим, что переменная A содержит 10, а переменная B содержит 20, тогда —
оператор | Описание | пример |
---|---|---|
== | Он проверяет, равны ли значения двух операндов или нет; если да, условие становится истинным. | (A == B) не соответствует действительности. |
знак равно | Он проверяет, равны ли значения двух операндов или нет; если значения не равны, то условие становится истинным. | (A! = B) верно. |
> | Он проверяет, больше ли значение левого операнда, чем значение правого операнда; если да, условие становится истинным. | (A> B) не соответствует действительности. |
< | Он проверяет, меньше ли значение левого операнда, чем значение правого операнда; если да, условие становится истинным. | (A <B) верно. |
> = | Он проверяет, больше ли значение левого операнда или равно значению правого операнда; если да, условие становится истинным. | (A> = B) не соответствует действительности. |
<= | Он проверяет, меньше ли значение левого операнда или равно значению правого операнда; если да, условие становится истинным. | (A <= B) верно. |
Логические Операторы
В следующей таблице перечислены все логические операторы, поддерживаемые языком Go. Предположим, что переменная A содержит 1, а переменная B содержит 0, тогда —
оператор | Описание | пример |
---|---|---|
&& | Называется логический оператор И. Если оба операнда отличны от нуля, условие становится истинным. | (A && B) неверно. |
|| | Вызывается логическим оператором ИЛИ. Если любой из двух операндов отличен от нуля, условие становится истинным. | (A || B) верно. |
! | Вызывается логическим оператором НЕ. Используйте для изменения логического состояния своего операнда. Если условие истинно, то оператор Логический НЕ будет делать ложь. | ! (A && B) верно. |
В следующей таблице приведены все логические операторы, поддерживаемые языком Go. Предположим, что переменная A имеет значение true, а переменная B содержит значение false, тогда —
оператор | Описание | пример |
---|---|---|
&& | Называется логический оператор И. Если оба операнда являются ложными, то условие становится ложным. | (A && B) неверно. |
|| | Вызывается логическим оператором ИЛИ. Если любой из двух операндов является истинным, тогда условие становится истинным. | (A || B) верно. |
! | Вызывается логическим оператором НЕ. Используйте для изменения логического состояния своего операнда. Если условие истинно, то оператор Логический НЕ сделает его ложным. | ! (A && B) верно. |
Битовые операторы
Битовые операторы работают с битами и выполняют побитовые операции. Таблицы истинности для &, | и ^ следующие:
п | Q | P & Q | р | Q | р ^ д |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
Предположим, А = 60; и B = 13. В двоичном формате они будут выглядеть следующим образом:
A = 0011 1100
B = 0000 1101
——————
A & B = 0000 1100
A | B = 0011 1101
A ^ B = 0011 0001
~ A = 1100 0011
Побитовые операторы, поддерживаемые языком Си, перечислены в следующей таблице. Предположим, что переменная A содержит 60, а переменная B содержит 13, тогда —
оператор | Описание | пример |
---|---|---|
& | Двоичный оператор AND немного копирует результат, если он существует в обоих операндах. | (A & B) даст 12, что составляет 0000 1100 |
| | Оператор двоичного ИЛИ копирует немного, если он существует в любом из операндов. | (A | B) даст 61, что составляет 0011 1101 |
^ | Двоичный оператор XOR копирует бит, если он установлен в одном операнде, но не в обоих. | (A ^ B) даст 49, что составляет 0011 0001 |
<< | Двоичный оператор левого сдвига. Значение левого операнда перемещается влево на количество битов, указанное правым операндом. | << 2 даст 240, что составляет 1111 0000 |
>> | Оператор двоичного правого сдвига. Значение левого операнда перемещается вправо на количество битов, указанное правым операндом. | A >> 2 даст 15, что 0000 1111 |
Операторы присваивания
В следующей таблице перечислены все операторы присваивания, поддерживаемые языком Go.
оператор | Описание | пример |
---|---|---|
знак равно | Простой оператор присваивания, присваивает значения от правых операндов к левому операнду | C = A + B назначит значение A + B в C |
+ = | Добавить оператор присваивания И, он добавляет правый операнд к левому операнду и присваивает результат левому операнду | C + = A эквивалентно C = C + A |
знак равно | Вычитание И оператор присваивания, вычитает правый операнд из левого операнда и присваивает результат левому операнду | C — = A эквивалентно C = C — A |
знак равно | Оператор присваивания умножения И, умножает правый операнд на левый операнд и присваивает результат левому операнду | C * = A эквивалентно C = C * A |
знак равно | Оператор деления И присваивания, делит левый операнд на правый операнд и присваивает результат левому операнду | C / = A эквивалентно C = C / A |
знак равно | Модуль и оператор присваивания, принимает модуль с использованием двух операндов и присваивает результат левому операнду | C% = A эквивалентно C = C% A |
<< = | Левый сдвиг И оператор присваивания | C << = 2 совпадает с C = C << 2 |
>> = | Оператор правого сдвига И присваивания | C >> = 2 — это то же самое, что C = C >> 2 |
знак равно | Побитовое И оператор присваивания | C & = 2 совпадает с C = C & 2 |
^ = | побитовое исключающее ИЛИ и оператор присваивания | C ^ = 2 совпадает с C = C ^ 2 |
| = | побитовое ИЛИ и оператор присваивания | C | = 2 — это то же самое, что C = C | 2 |
Разные операторы
Go Language поддерживает несколько других важных операторов, включая sizeof и ?:.
оператор | Описание | пример |
---|---|---|
& | Возвращает адрес переменной. | & А; предоставляет фактический адрес переменной. |
* | Указатель на переменную. | * А; предоставляет указатель на переменную. |
Приоритет операторов в Go
Приоритет оператора определяет группировку терминов в выражении. Это влияет на то, как оценивается выражение. Некоторые операторы имеют более высокий приоритет, чем другие; например, оператор умножения имеет более высокий приоритет, чем оператор сложения.
Например, х = 7 + 3 * 2; здесь x назначено 13, а не 20, потому что оператор * имеет более высокий приоритет, чем +, поэтому он сначала умножается на 3 * 2, а затем прибавляется к 7.
Здесь операторы с самым высоким приоритетом отображаются вверху таблицы, а операторы с самым низким — внизу. Внутри выражения операторы с более высоким приоритетом будут оцениваться первыми.
категория | оператор | Ассоциативность |
---|---|---|
постфикс | () [] ->. ++ — — | Слева направо |
Одинарный | + -! ~ ++ — — (тип) * & sizeof | Справа налево |
Multiplicative | * /% | Слева направо |
присадка | + — | Слева направо |
сдвиг | << >> | Слева направо |
реляционный | <<=>> = | Слева направо |
равенство | ==! = | Слева направо |
Побитовое И | & | Слева направо |
Побитовый XOR | ^ | Слева направо |
Побитовое ИЛИ | | | Слева направо |
Логическое И | && | Слева направо |
Логическое ИЛИ | || | Слева направо |
условный | ?: | Справа налево |
присваивание | = + = — = * = / =% = >> = << = & = ^ = | = | Справа налево |
запятая | , | Слева направо |
Go — Принятие решений
Структуры принятия решений требуют, чтобы программист указал одно или несколько условий, которые должны быть оценены или протестированы программой, вместе с оператором или инструкциями, которые должны быть выполнены, если условие определено как истинное, и, необязательно, другие операторы, которые должны быть выполнены, если условие определяется как ложный.
Ниже приводится общая форма типичной структуры принятия решений, встречающейся в большинстве языков программирования.
Язык программирования Go предоставляет следующие типы решений для принятия решений. Нажмите на следующие ссылки, чтобы проверить их детали.
Sr.No | Заявление и описание |
---|---|
1 | если заявление
Оператор if состоит из логического выражения, за которым следует одно или несколько операторов. |
2 | если … еще заявление
За оператором if может следовать необязательный оператор else , который выполняется, когда логическое выражение имеет значение false. |
3 | вложенные операторы if
Вы можете использовать один оператор if или else if внутри другого оператора if или else if . |
4 | заявление о переключении
Оператор switch позволяет проверять переменную на соответствие списку значений. |
5 | выберите заявление
Оператор select похож на оператор switch с тем отличием, что операторы case относятся к каналам связи. |
Оператор if состоит из логического выражения, за которым следует одно или несколько операторов.
За оператором if может следовать необязательный оператор else , который выполняется, когда логическое выражение имеет значение false.
Вы можете использовать один оператор if или else if внутри другого оператора if или else if .
Оператор switch позволяет проверять переменную на соответствие списку значений.
Оператор select похож на оператор switch с тем отличием, что операторы case относятся к каналам связи.
Go — Loops
Может возникнуть ситуация, когда вам нужно выполнить блок кода несколько раз. В общем случае операторы выполняются последовательно: первый оператор в функции выполняется первым, затем второй и так далее.
Языки программирования предоставляют различные управляющие структуры, которые допускают более сложные пути выполнения.
Оператор цикла позволяет нам выполнять оператор или группу операторов несколько раз, и в большинстве языков программирования ниже приводится общая форма инструкции цикла.
Язык программирования Go предоставляет следующие типы циклов для обработки требований циклов.
Sr.No | Тип и описание петли |
---|---|
1 | для цикла
Он выполняет последовательность операторов несколько раз и сокращает код, который управляет переменной цикла. |
2 | вложенные циклы
Это один или несколько циклов внутри любого цикла for. |
Он выполняет последовательность операторов несколько раз и сокращает код, который управляет переменной цикла.
Это один или несколько циклов внутри любого цикла for.
Заявления о контроле цикла
Операторы управления циклом изменяют выполнение от его нормальной последовательности. Когда выполнение покидает свою область действия, все автоматические объекты, созданные в этой области, уничтожаются.
Go поддерживает следующие операторы управления —
Sr.No | Контрольное заявление и описание |
---|---|
1 | заявление о нарушении
Он завершает цикл for или оператор switch и передает выполнение в оператор, следующий сразу за циклом for или switch. |
2 | продолжить заявление
Это приводит к тому, что цикл пропускает оставшуюся часть своего тела и немедленно проверяет свое состояние перед повторением. |
3 | Перейти к заявлению
Он передает управление помеченному выражению. |
Он завершает цикл for или оператор switch и передает выполнение в оператор, следующий сразу за циклом for или switch.
Это приводит к тому, что цикл пропускает оставшуюся часть своего тела и немедленно проверяет свое состояние перед повторением.
Он передает управление помеченному выражению.
Бесконечный цикл
Цикл становится бесконечным, если его условие никогда не становится ложным. Цикл for традиционно используется для этой цели. Поскольку ни одно из трех выражений, образующих цикл for, не требуется, вы можете создать бесконечный цикл, оставив условное выражение пустым или передав ему значение true.
package main import "fmt" func main() { for true { fmt.Printf("This loop will run forever.\n"); } }
Когда условное выражение отсутствует, оно считается истинным. У вас может быть выражение инициализации и приращения, но программисты на Си чаще используют конструкцию for (;;) для обозначения бесконечного цикла.
Примечание. Вы можете завершить бесконечный цикл нажатием клавиш Ctrl + C.
Go — Функции
Функция — это группа операторов, которые вместе выполняют задачу. Каждая программа Go имеет хотя бы одну функцию — main () . Вы можете разделить свой код на отдельные функции. Как вы делите свой код между различными функциями, зависит от вас, но логически разделение должно быть таким, чтобы каждая функция выполняла определенную задачу.
Объявление функции сообщает компилятору об имени функции, типе возвращаемого значения и параметрах. Определение функции обеспечивает фактическое тело функции.
Стандартная библиотека Go предоставляет множество встроенных функций, которые может вызывать ваша программа. Например, функция len () принимает аргументы различных типов и возвращает длину типа. Если ей передается строка, функция возвращает длину строки в байтах. Если ему передан массив, функция возвращает длину массива.
Функции также известны как метод, подпрограмма или процедура .
Определение функции
Общая форма определения функции в языке программирования Go выглядит следующим образом:
func function_name( [parameter list] ) [return_types] { body of the function }
Определение функции в языке программирования Go состоит из заголовка функции и тела функции . Вот все части функции —
-
Func — запускает объявление функции.
-
Имя функции — это фактическое имя функции. Имя функции и список параметров вместе составляют сигнатуру функции.
-
Параметры — параметр похож на заполнитель. Когда вызывается функция, вы передаете значение параметру. Это значение называется фактическим параметром или аргументом. Список параметров относится к типу, порядку и количеству параметров функции. Параметры являются необязательными; то есть функция может не содержать параметров.
-
Тип возврата — функция может возвращать список значений. Return_types — это список типов данных значений, которые возвращает функция. Некоторые функции выполняют нужные операции без возврата значения. В этом случае return_type не является обязательным.
-
Тело функции — содержит набор операторов, которые определяют, что делает функция.
Func — запускает объявление функции.
Имя функции — это фактическое имя функции. Имя функции и список параметров вместе составляют сигнатуру функции.
Параметры — параметр похож на заполнитель. Когда вызывается функция, вы передаете значение параметру. Это значение называется фактическим параметром или аргументом. Список параметров относится к типу, порядку и количеству параметров функции. Параметры являются необязательными; то есть функция может не содержать параметров.
Тип возврата — функция может возвращать список значений. Return_types — это список типов данных значений, которые возвращает функция. Некоторые функции выполняют нужные операции без возврата значения. В этом случае return_type не является обязательным.
Тело функции — содержит набор операторов, которые определяют, что делает функция.
пример
Следующий исходный код показывает функцию с именем max () . Эта функция принимает два параметра num1 и num2 и возвращает максимум между двумя —
/* function returning the max between two numbers */ func max(num1, num2 int) int { /* local variable declaration */ result int if (num1 > num2) { result = num1 } else { result = num2 } return result }
Вызов функции
При создании функции Go вы даете определение того, что должна делать функция. Чтобы использовать функцию, вам нужно будет вызвать эту функцию для выполнения определенной задачи.
Когда программа вызывает функцию, управление программой передается вызываемой функции. Вызываемая функция выполняет определенную задачу, и когда выполняется ее оператор return или когда достигается закрывающая фигурная скобка, завершающая функцию, она возвращает управление программой обратно в основную программу.
Чтобы вызвать функцию, вам просто нужно передать необходимые параметры вместе с именем функции. Если функция возвращает значение, вы можете сохранить возвращенное значение. Например —
package main import "fmt" func main() { /* local variable definition */ var a int = 100 var b int = 200 var ret int /* calling a function to get max value */ ret = max(a, b) fmt.Printf( "Max value is : %d\n", ret ) } /* function returning the max between two numbers */ func max(num1, num2 int) int { /* local variable declaration */ var result int if (num1 > num2) { result = num1 } else { result = num2 } return result }
Мы сохранили функцию max () вместе с функцией main () и скомпилировали исходный код. Запустив финальный исполняемый файл, он даст следующий результат:
Max value is : 200
Возврат нескольких значений из функции
Функция Go может возвращать несколько значений. Например —
package main import "fmt" func swap(x, y string) (string, string) { return y, x } func main() { a, b := swap("Mahesh", "Kumar") fmt.Println(a, b) }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Kumar Mahesh
Аргументы функции
Если функция должна использовать аргументы, она должна объявлять переменные, которые принимают значения аргументов. Эти переменные называются формальными параметрами функции.
Формальные параметры ведут себя как другие локальные переменные внутри функции и создаются при входе в функцию и уничтожаются при выходе.
При вызове функции существует два способа передачи аргументов в функцию:
Sr.No | Тип звонка и описание |
---|---|
1 | Звонок по значению
Этот метод копирует фактическое значение аргумента в формальный параметр функции. В этом случае изменения, внесенные в параметр внутри функции, не влияют на аргумент. |
2 | Звоните по ссылке
Этот метод копирует адрес аргумента в формальный параметр. Внутри функции адрес используется для доступа к фактическому аргументу, используемому в вызове. Это означает, что изменения, внесенные в параметр, влияют на аргумент. |
Этот метод копирует фактическое значение аргумента в формальный параметр функции. В этом случае изменения, внесенные в параметр внутри функции, не влияют на аргумент.
Этот метод копирует адрес аргумента в формальный параметр. Внутри функции адрес используется для доступа к фактическому аргументу, используемому в вызове. Это означает, что изменения, внесенные в параметр, влияют на аргумент.
По умолчанию Go использует вызов по значению для передачи аргументов. В общем, это означает, что код внутри функции не может изменить аргументы, используемые для вызова функции. Приведенная выше программа при вызове функции max () использовала тот же метод.
Использование функции
Функцию можно использовать следующими способами:
Sr.No | Использование функции и описание |
---|---|
1 | Функция как ценность
Функции могут быть созданы на лету и могут быть использованы в качестве значений. |
2 | Закрытие функций
Закрытия функций являются анонимными функциями и могут использоваться в динамическом программировании. |
3 | метод
Методы — это специальные функции с приемником. |
Функции могут быть созданы на лету и могут быть использованы в качестве значений.
Закрытия функций являются анонимными функциями и могут использоваться в динамическом программировании.
Методы — это специальные функции с приемником.
Go — Scope Rules
Область действия в любом программировании — это область программы, в которой может существовать определенная переменная, и за пределами этой переменной доступ невозможен. В языке программирования Go можно объявить переменные в трех местах:
-
Внутри функции или блока ( локальные переменные)
-
За пределами всех функций ( глобальные переменные)
-
При определении параметров функции ( формальных параметров)
Внутри функции или блока ( локальные переменные)
За пределами всех функций ( глобальные переменные)
При определении параметров функции ( формальных параметров)
Давайте выясним, что такое локальные и глобальные переменные и каковы формальные параметры.
Локальные переменные
Переменные, которые объявлены внутри функции или блока, называются локальными переменными. Они могут использоваться только операторами, которые находятся внутри этой функции или блока кода. Локальные переменные не известны функциям вне их собственных. В следующем примере используются локальные переменные. Здесь все переменные a, b и c являются локальными для функции main ().
package main import "fmt" func main() { /* local variable declaration */ var a, b, c int /* actual initialization */ a = 10 b = 20 c = a + b fmt.Printf ("value of a = %d, b = %d and c = %d\n", a, b, c) }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
value of a = 10, b = 20 and c = 30
Глобальные переменные
Глобальные переменные определяются вне функции, обычно в верхней части программы. Глобальные переменные сохраняют свое значение на протяжении всего жизненного цикла программы, и к ним можно получить доступ в любой из функций, определенных для программы.
Глобальная переменная может быть доступна любой функции. То есть глобальная переменная доступна для использования во всей программе после ее объявления. В следующем примере используются как глобальные, так и локальные переменные —
package main import "fmt" /* global variable declaration */ var g int func main() { /* local variable declaration */ var a, b int /* actual initialization */ a = 10 b = 20 g = a + b fmt.Printf("value of a = %d, b = %d and g = %d\n", a, b, g) }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
value of a = 10, b = 20 and g = 30
Программа может иметь одинаковое имя для локальных и глобальных переменных, но значение локальной переменной внутри функции имеет преимущество. Например —
package main import "fmt" /* global variable declaration */ var g int = 20 func main() { /* local variable declaration */ var g int = 10 fmt.Printf ("value of g = %d\n", g) }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
value of g = 10
Формальные параметры
Формальные параметры обрабатываются как локальные переменные внутри этой функции и имеют преимущество перед глобальными переменными. Например —
package main import "fmt" /* global variable declaration */ var a int = 20; func main() { /* local variable declaration in main function */ var a int = 10 var b int = 20 var c int = 0 fmt.Printf("value of a in main() = %d\n", a); c = sum( a, b); fmt.Printf("value of c in main() = %d\n", c); } /* function to add two integers */ func sum(a, b int) int { fmt.Printf("value of a in sum() = %d\n", a); fmt.Printf("value of b in sum() = %d\n", b); return a + b; }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
value of a in main() = 10 value of a in sum() = 10 value of b in sum() = 20 value of c in main() = 30
Инициализация локальных и глобальных переменных
Локальные и глобальные переменные инициализируются значением по умолчанию, равным 0; в то время как указатели инициализируются до нуля.
Тип данных | Начальное значение по умолчанию |
---|---|
ИНТ | 0 |
float32 | 0 |
указатель | ноль |
Go — Струны
Строки, которые широко используются в программировании на Go, представляют собой фрагмент байтов, доступный только для чтения. В языке программирования Go строки представляют собой фрагменты . Платформа Go предоставляет различные библиотеки для работы со строками.
- юникода
- регулярное выражение
- строки
Создание строк
Самый прямой способ создать строку — написать
var greeting = "Hello world!"
Всякий раз, когда он встречает строковый литерал в вашем коде, компилятор создает строковый объект со значением в этом случае «Hello world!».
Строковый литерал содержит допустимые последовательности UTF-8, называемые рунами. Строка содержит произвольные байты.
package main import "fmt" func main() { var greeting = "Hello world!" fmt.Printf("normal string: ") fmt.Printf("%s", greeting) fmt.Printf("\n") fmt.Printf("hex bytes: ") for i := 0; i < len(greeting); i++ { fmt.Printf("%x ", greeting[i]) } fmt.Printf("\n") const sampleText = "\xbd\xb2\x3d\xbc\x20\xe2\x8c\x98" /*q flag escapes unprintable characters, with + flag it escapses non-ascii characters as well to make output unambigous */ fmt.Printf("quoted string: ") fmt.Printf("%+q", sampleText) fmt.Printf("\n") }
Это даст следующий результат —
normal string: Hello world! hex bytes: 48 65 6c 6c 6f 20 77 6f 72 6c 64 21 quoted string: "\xbd\xb2=\xbc \u2318"
Примечание . Строковый литерал является неизменным, поэтому после его создания строковый литерал нельзя изменить.
Длина строки
Метод len (str) возвращает количество байтов, содержащихся в строковом литерале.
package main import "fmt" func main() { var greeting = "Hello world!" fmt.Printf("String Length is: ") fmt.Println(len(greeting)) }
Это даст следующий результат —
String Length is : 12
Конкатенация строк
Пакет strings включает в себя метод join для объединения нескольких строк —
strings.Join(sample, " ")
Объединение объединяет элементы массива для создания одной строки. Второй параметр — это разделитель, который размещается между элементами массива.
Давайте посмотрим на следующий пример —
package main import ("fmt" "math" )"fmt" "strings") func main() { greetings := []string{"Hello","world!"} fmt.Println(strings.Join(greetings, " ")) }
Это даст следующий результат —
Hello world!
Go — Массивы
Язык программирования Go предоставляет структуру данных, называемую массивом , в которой можно хранить последовательную коллекцию элементов одного и того же типа. Массив используется для хранения коллекции данных, но часто более полезно думать о массиве как о коллекции переменных одного типа.
Вместо того, чтобы объявлять отдельные переменные, такие как number0, number1, … и number99, вы объявляете одну переменную массива, такую как числа, и используете числа [0], числа [1] и …, числа [99] для представления отдельные переменные. Определенный элемент в массиве доступен по индексу.
Все массивы состоят из смежных областей памяти. Самый низкий адрес соответствует первому элементу, а самый высокий адрес — последнему.
Объявление массивов
Чтобы объявить массив в Go, программист определяет тип элементов и количество элементов, требуемых массивом, следующим образом:
var variable_name [SIZE] variable_type
Это называется одномерным массивом. ArraySize должен быть целочисленной константой, большей нуля, и типом может быть любой допустимый тип данных Go. Например, чтобы объявить массив из 10 элементов с именем balance типа float32, используйте этот оператор —
var balance [10] float32
Здесь баланс — это переменный массив, который может содержать до 10 чисел с плавающей запятой.
Инициализация массивов
Вы можете инициализировать массив в Go либо один за другим, либо используя один оператор следующим образом:
var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
Число значений в фигурных скобках {} не может быть больше, чем количество элементов, которые мы объявляем для массива в квадратных скобках [].
Если вы опустите размер массива, будет создан массив, достаточно большой, чтобы вместить инициализацию. Поэтому, если вы напишите —
var balance = []float32{1000.0, 2.0, 3.4, 7.0, 50.0}
Вы создадите точно такой же массив, как и в предыдущем примере. Ниже приведен пример назначения одного элемента массива:
balance[4] = 50.0
Вышеприведенный оператор присваивает элемент 5- й в массиве со значением 50,0. Все массивы имеют 0 в качестве индекса их первого элемента, который также называется базовым индексом, а последний индекс массива будет общим размером массива минус 1. Ниже приведено графическое представление того же массива, который мы обсуждали выше —
Доступ к элементам массива
Доступ к элементу осуществляется путем индексации имени массива. Это делается путем помещения индекса элемента в квадратные скобки после имени массива. Например —
float32 salary = balance[9]
Приведенный выше оператор возьмет 10- й элемент из массива и присвоит значение переменной salary. Ниже приведен пример, который будет использовать все три вышеупомянутых понятия, а именно. декларация, назначение и доступ к массивам —
package main import "fmt" func main() { var n [10]int /* n is an array of 10 integers */ var i,j int /* initialize elements of array n to 0 */ for i = 0; i < 10; i++ { n[i] = i + 100 /* set element at location i to i + 100 */ } /* output each array element's value */ for j = 0; j < 10; j++ { fmt.Printf("Element[%d] = %d\n", j, n[j] ) } }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Element[0] = 100 Element[1] = 101 Element[2] = 102 Element[3] = 103 Element[4] = 104 Element[5] = 105 Element[6] = 106 Element[7] = 107 Element[8] = 108 Element[9] = 109
Перейти массивы в деталях
Есть важные понятия, связанные с массивом, которые должны быть понятны программисту на Go —
Sr.No | Концепция и описание |
---|---|
1 | Многомерные массивы
Go поддерживает многомерные массивы. Простейшей формой многомерного массива является двумерный массив. |
2 | Передача массивов в функции
Вы можете передать функции указатель на массив, указав имя массива без индекса. |
Go поддерживает многомерные массивы. Простейшей формой многомерного массива является двумерный массив.
Вы можете передать функции указатель на массив, указав имя массива без индекса.
Go — указатели
Указатели на Go легко и весело выучить. Некоторые задачи программирования Go выполняются проще с помощью указателей, а другие задачи, такие как вызов по ссылке, не могут быть выполнены без использования указателей. Поэтому становится необходимым изучать указатели, чтобы стать идеальным программистом на Go.
Как вы знаете, каждая переменная является ячейкой памяти, и каждая ячейка памяти имеет свой адрес, к которому можно обратиться, используя оператор амперсанда (&), который обозначает адрес в памяти. Рассмотрим следующий пример, который выведет адрес определенных переменных:
package main import "fmt" func main() { var a int = 10 fmt.Printf("Address of a variable: %x\n", &a ) }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Address of a variable: 10328000
Итак, вы поняли, что такое адрес памяти и как к нему обращаться. Теперь давайте посмотрим, что такое указатели.
Что такое указатели?
Указатель — это переменная, значением которой является адрес другой переменной, т. Е. Прямой адрес ячейки памяти. Как и любая переменная или константа, вы должны объявить указатель, прежде чем использовать его для хранения любого адреса переменной. Общая форма объявления переменной указателя —
var var_name *var-type
Здесь тип — это базовый тип указателя; это должен быть допустимый тип данных C, а var-name — это имя переменной-указателя. Звездочка *, которую вы использовали для объявления указателя, та же, что и для умножения. Однако в этом утверждении звездочка используется для обозначения переменной в качестве указателя. Следующее является действительным объявлением указателя —
var ip *int /* pointer to an integer */ var fp *float32 /* pointer to a float */
Фактический тип данных значения всех указателей, будь то целое число, число с плавающей запятой или другое, является одним и тем же, длинное шестнадцатеричное число, представляющее адрес памяти. Единственное различие между указателями разных типов данных — это тип данных переменной или константы, на которую указывает указатель.
Как использовать указатели?
Есть несколько важных операций, которые мы часто выполняем с указателями: (а) мы определяем переменные указателя, (б) назначаем адрес переменной указателю и (в) получаем доступ к значению по адресу, хранящемуся в переменной указателя ,
Все эти операции выполняются с использованием унарного оператора *, который возвращает значение переменной, расположенной по адресу, указанному ее операндом. В следующем примере показано, как выполнить эти операции.
package main import "fmt" func main() { var a int = 20 /* actual variable declaration */ var ip *int /* pointer variable declaration */ ip = &a /* store address of a in pointer variable*/ fmt.Printf("Address of a variable: %x\n", &a ) /* address stored in pointer variable */ fmt.Printf("Address stored in ip variable: %x\n", ip ) /* access the value using the pointer */ fmt.Printf("Value of *ip variable: %d\n", *ip ) }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Address of var variable: 10328000 Address stored in ip variable: 10328000 Value of *ip variable: 20
Ноль указателей в го
Go компилятор присваивает значение Nil переменной указателя в случае, если у вас нет точного адреса для назначения. Это делается во время объявления переменной. Указатель, которому назначен nil, называется указателем nil .
Указатель nil — это константа со значением ноль, определенная в нескольких стандартных библиотеках. Рассмотрим следующую программу —
package main import "fmt" func main() { var ptr *int fmt.Printf("The value of ptr is : %x\n", ptr ) }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
The value of ptr is 0
В большинстве операционных систем программам не разрешен доступ к памяти по адресу 0, поскольку эта память зарезервирована операционной системой. Однако адрес памяти 0 имеет особое значение; он сигнализирует о том, что указатель не предназначен для указания на доступную ячейку памяти. Но по соглашению, если указатель содержит значение nil (ноль), предполагается, что он ничего не указывает.
Чтобы проверить нулевой указатель, вы можете использовать оператор if следующим образом:
if(ptr != nil) /* succeeds if p is not nil */ if(ptr == nil) /* succeeds if p is null */
Перейти указатели в деталях
У указателей есть много, но простых концепций, и они очень важны для программирования на Go. Следующие понятия указателей должны быть понятны программисту на Go —
Sr.No | Концепция и описание |
---|---|
1 | Go — Массив указателей
Вы можете определить массивы для хранения нескольких указателей. |
2 | Go — указатель на указатель
Go позволяет вам иметь указатель на указатель и так далее. |
3 | Передача указателей на функции в Go
Передача аргумента по ссылке или по адресу позволяет включить переданный аргумент в вызывающей функции вызываемой функцией. |
Вы можете определить массивы для хранения нескольких указателей.
Go позволяет вам иметь указатель на указатель и так далее.
Передача аргумента по ссылке или по адресу позволяет включить переданный аргумент в вызывающей функции вызываемой функцией.
Go — Структуры
Массивы Go позволяют вам определять переменные, которые могут содержать несколько элементов данных одного вида. Структура — это еще один пользовательский тип данных, доступный в программировании на Go, который позволяет комбинировать элементы данных различных типов.
Структуры используются для представления записи. Предположим, вы хотите отслеживать книги в библиотеке. Вы можете отслеживать следующие атрибуты каждой книги —
- заглавие
- автор
- Предмет
- ID книги
В таком сценарии структуры очень полезны.
Определение структуры
Чтобы определить структуру, вы должны использовать операторы типа и структуры . Оператор struct определяет новый тип данных с несколькими членами для вашей программы. Оператор type связывает имя с типом, который в нашем случае является struct. Формат оператора структуры следующий:
type struct_variable_type struct { member definition; member definition; ... member definition; }
После определения типа структуры его можно использовать для объявления переменных этого типа с использованием следующего синтаксиса.
variable_name := structure_variable_type {value1, value2...valuen}
Доступ к членам структуры
Чтобы получить доступ к любому члену структуры, мы используем оператор доступа к члену (.). Оператор доступа к элементу кодируется как точка между именем структурной переменной и элементом структуры, к которому мы хотим получить доступ. Вы должны использовать ключевое слово struct для определения переменных типа структуры. В следующем примере объясняется, как использовать структуру —
package main import "fmt" type Books struct { title string author string subject string book_id int } func main() { var Book1 Books /* Declare Book1 of type Book */ var Book2 Books /* Declare Book2 of type Book */ /* book 1 specification */ Book1.title = "Go Programming" Book1.author = "Mahesh Kumar" Book1.subject = "Go Programming Tutorial" Book1.book_id = 6495407 /* book 2 specification */ Book2.title = "Telecom Billing" Book2.author = "Zara Ali" Book2.subject = "Telecom Billing Tutorial" Book2.book_id = 6495700 /* print Book1 info */ fmt.Printf( "Book 1 title : %s\n", Book1.title) fmt.Printf( "Book 1 author : %s\n", Book1.author) fmt.Printf( "Book 1 subject : %s\n", Book1.subject) fmt.Printf( "Book 1 book_id : %d\n", Book1.book_id) /* print Book2 info */ fmt.Printf( "Book 2 title : %s\n", Book2.title) fmt.Printf( "Book 2 author : %s\n", Book2.author) fmt.Printf( "Book 2 subject : %s\n", Book2.subject) fmt.Printf( "Book 2 book_id : %d\n", Book2.book_id) }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Book 1 title : Go Programming Book 1 author : Mahesh Kumar Book 1 subject : Go Programming Tutorial Book 1 book_id : 6495407 Book 2 title : Telecom Billing Book 2 author : Zara Ali Book 2 subject : Telecom Billing Tutorial Book 2 book_id : 6495700
Структуры как аргументы функций
Вы можете передать структуру в качестве аргумента функции так же, как и любую другую переменную или указатель. Вы будете обращаться к структурным переменным так же, как в предыдущем примере:
package main import "fmt" type Books struct { title string author string subject string book_id int } func main() { var Book1 Books /* Declare Book1 of type Book */ var Book2 Books /* Declare Book2 of type Book */ /* book 1 specification */ Book1.title = "Go Programming" Book1.author = "Mahesh Kumar" Book1.subject = "Go Programming Tutorial" Book1.book_id = 6495407 /* book 2 specification */ Book2.title = "Telecom Billing" Book2.author = "Zara Ali" Book2.subject = "Telecom Billing Tutorial" Book2.book_id = 6495700 /* print Book1 info */ printBook(Book1) /* print Book2 info */ printBook(Book2) } func printBook( book Books ) { fmt.Printf( "Book title : %s\n", book.title); fmt.Printf( "Book author : %s\n", book.author); fmt.Printf( "Book subject : %s\n", book.subject); fmt.Printf( "Book book_id : %d\n", book.book_id); }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Book title : Go Programming Book author : Mahesh Kumar Book subject : Go Programming Tutorial Book book_id : 6495407 Book title : Telecom Billing Book author : Zara Ali Book subject : Telecom Billing Tutorial Book book_id : 6495700
Указатели на структуры
Вы можете определить указатели на структуры так же, как вы определяете указатель на любую другую переменную следующим образом:
var struct_pointer *Books
Теперь вы можете сохранить адрес структурной переменной в указанной выше переменной-указателе. Чтобы найти адрес структурной переменной, поместите оператор & перед именем структуры следующим образом:
struct_pointer = &Book1;
Чтобы получить доступ к членам структуры, используя указатель на эту структуру, вы должны использовать «.» оператор следующим образом —
struct_pointer.title;
Давайте перепишем приведенный выше пример, используя указатель структуры —
package main import "fmt" type Books struct { title string author string subject string book_id int } func main() { var Book1 Books /* Declare Book1 of type Book */ var Book2 Books /* Declare Book2 of type Book */ /* book 1 specification */ Book1.title = "Go Programming" Book1.author = "Mahesh Kumar" Book1.subject = "Go Programming Tutorial" Book1.book_id = 6495407 /* book 2 specification */ Book2.title = "Telecom Billing" Book2.author = "Zara Ali" Book2.subject = "Telecom Billing Tutorial" Book2.book_id = 6495700 /* print Book1 info */ printBook(&Book1) /* print Book2 info */ printBook(&Book2) } func printBook( book *Books ) { fmt.Printf( "Book title : %s\n", book.title); fmt.Printf( "Book author : %s\n", book.author); fmt.Printf( "Book subject : %s\n", book.subject); fmt.Printf( "Book book_id : %d\n", book.book_id); }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Book title : Go Programming Book author : Mahesh Kumar Book subject : Go Programming Tutorial Book book_id : 6495407 Book title : Telecom Billing Book author : Zara Ali Book subject : Telecom Billing Tutorial Book book_id : 6495700
Go — ломтики
Go Slice — это абстракция над Go Array. Go Array позволяет вам определять переменные, которые могут содержать несколько элементов данных одного и того же вида, но не предоставляет встроенного метода для динамического увеличения его размера или получения собственного подмассива. Ломтики преодолевают это ограничение. Он предоставляет много полезных функций, необходимых для Array, и широко используется в программировании на Go.
Определение среза
Чтобы определить срез, вы можете объявить его как массив без указания его размера. Кроме того, вы можете использовать функцию make для создания среза.
var numbers []int /* a slice of unspecified size */ /* numbers == []int{0,0,0,0,0}*/ numbers = make([]int,5,5) /* a slice of length 5 and capacity 5*/
Функции len () и cap ()
Срез — это абстракция над массивом. На самом деле он использует массивы в качестве базовой структуры. Функция len () возвращает элементы, представленные в срезе, где функция cap () возвращает объем среза (т. Е. Сколько элементов в нем можно разместить). В следующем примере объясняется использование слайса —
package main import "fmt" func main() { var numbers = make([]int,3,5) printSlice(numbers) } func printSlice(x []int){ fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x) }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
len = 3 cap = 5 slice = [0 0 0]
Ноль ломтик
Если срез объявлен без входов, то по умолчанию он инициализируется как nil. Его длина и емкость равны нулю. Например —
package main import "fmt" func main() { var numbers []int printSlice(numbers) if(numbers == nil){ fmt.Printf("slice is nil") } } func printSlice(x []int){ fmt.Printf("len = %d cap = %d slice = %v\n", len(x), cap(x),x) }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
len = 0 cap = 0 slice = [] slice is nil
Subslicing
Slice позволяет указать нижнюю и верхнюю границу, чтобы получить ее сублицензию, используя [нижняя граница: верхняя граница] . Например —
package main import "fmt" func main() { /* create a slice */ numbers := []int{0,1,2,3,4,5,6,7,8} printSlice(numbers) /* print the original slice */ fmt.Println("numbers ==", numbers) /* print the sub slice starting from index 1(included) to index 4(excluded)*/ fmt.Println("numbers[1:4] ==", numbers[1:4]) /* missing lower bound implies 0*/ fmt.Println("numbers[:3] ==", numbers[:3]) /* missing upper bound implies len(s)*/ fmt.Println("numbers[4:] ==", numbers[4:]) numbers1 := make([]int,0,5) printSlice(numbers1) /* print the sub slice starting from index 0(included) to index 2(excluded) */ number2 := numbers[:2] printSlice(number2) /* print the sub slice starting from index 2(included) to index 5(excluded) */ number3 := numbers[2:5] printSlice(number3) } func printSlice(x []int){ fmt.Printf("len = %d cap = %d slice = %v\n", len(x), cap(x),x) }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
len = 9 cap = 9 slice = [0 1 2 3 4 5 6 7 8] numbers == [0 1 2 3 4 5 6 7 8] numbers[1:4] == [1 2 3] numbers[:3] == [0 1 2] numbers[4:] == [4 5 6 7 8] len = 0 cap = 5 slice = [] len = 2 cap = 9 slice = [0 1] len = 3 cap = 7 slice = [2 3 4]
Функции append () и copy ()
Можно увеличить емкость среза с помощью функции append () . Используя функцию copy () , содержимое исходного слайса копируется в целевой слайс. Например —
package main import "fmt" func main() { var numbers []int printSlice(numbers) /* append allows nil slice */ numbers = append(numbers, 0) printSlice(numbers) /* add one element to slice*/ numbers = append(numbers, 1) printSlice(numbers) /* add more than one element at a time*/ numbers = append(numbers, 2,3,4) printSlice(numbers) /* create a slice numbers1 with double the capacity of earlier slice*/ numbers1 := make([]int, len(numbers), (cap(numbers))*2) /* copy content of numbers to numbers1 */ copy(numbers1,numbers) printSlice(numbers1) } func printSlice(x []int){ fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x) }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
len = 0 cap = 0 slice = [] len = 1 cap = 2 slice = [0] len = 2 cap = 2 slice = [0 1] len = 5 cap = 8 slice = [0 1 2 3 4] len = 5 cap = 16 slice = [0 1 2 3 4]
Go — Range
Ключевое слово range используется в цикле for для перебора элементов массива, среза, канала или карты. С массивом и слайсами он возвращает индекс элемента в виде целого числа. С картами он возвращает ключ следующей пары ключ-значение. Диапазон возвращает одно значение или два. Если слева от выражения диапазона используется только одно значение, это будет 1-е значение в следующей таблице.
Выражение диапазона | 1-е значение | 2-е значение (необязательно) |
---|---|---|
Массив или нарезать [n] E | Индекс я Int | а я |
Строка с типом строки | Индекс я Int | Руна Инт |
карта м карта [K] V | ключ к к | значение m [k] V |
канал с тян E | элемент е Е | никто |
пример
Следующий абзац показывает, как использовать диапазон —
package main import "fmt" func main() { /* create a slice */ numbers := []int{0,1,2,3,4,5,6,7,8} /* print the numbers */ for i:= range numbers { fmt.Println("Slice item",i,"is",numbers[i]) } /* create a map*/ countryCapitalMap := map[string] string {"France":"Paris","Italy":"Rome","Japan":"Tokyo"} /* print map using keys*/ for country := range countryCapitalMap { fmt.Println("Capital of",country,"is",countryCapitalMap[country]) } /* print map using key-value*/ for country,capital := range countryCapitalMap { fmt.Println("Capital of",country,"is",capital) } }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Slice item 0 is 0 Slice item 1 is 1 Slice item 2 is 2 Slice item 3 is 3 Slice item 4 is 4 Slice item 5 is 5 Slice item 6 is 6 Slice item 7 is 7 Slice item 8 is 8 Capital of France is Paris Capital of Italy is Rome Capital of Japan is Tokyo Capital of France is Paris Capital of Italy is Rome Capital of Japan is Tokyo
Go — Карты
Go предоставляет другой важный тип данных с именем map, который сопоставляет уникальные ключи со значениями. Ключ — это объект, который вы используете для получения значения позднее. Имея ключ и значение, вы можете сохранить это значение в объекте Map. После того, как значение сохранено, вы можете получить его, используя его ключ.
Определение карты
Вы должны использовать функцию make для создания карты.
/* declare a variable, by default map will be nil*/ var map_variable map[key_data_type]value_data_type /* define the map as nil map can not be assigned any value*/ map_variable = make(map[key_data_type]value_data_type)
пример
В следующем примере показано, как создать и использовать карту.
package main import "fmt" func main() { var countryCapitalMap map[string]string /* create a map*/ countryCapitalMap = make(map[string]string) /* insert key-value pairs in the map*/ countryCapitalMap["France"] = "Paris" countryCapitalMap["Italy"] = "Rome" countryCapitalMap["Japan"] = "Tokyo" countryCapitalMap["India"] = "New Delhi" /* print map using keys*/ for country := range countryCapitalMap { fmt.Println("Capital of",country,"is",countryCapitalMap[country]) } /* test if entry is present in the map or not*/ capital, ok := countryCapitalMap["United States"] /* if ok is true, entry is present otherwise entry is absent*/ if(ok){ fmt.Println("Capital of United States is", capital) } else { fmt.Println("Capital of United States is not present") } }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Capital of India is New Delhi Capital of France is Paris Capital of Italy is Rome Capital of Japan is Tokyo Capital of United States is not present
функция удаления ()
Функция delete () используется для удаления записи с карты. Требуется карта и соответствующий ключ, который необходимо удалить. Например —
package main import "fmt" func main() { /* create a map*/ countryCapitalMap := map[string] string {"France":"Paris","Italy":"Rome","Japan":"Tokyo","India":"New Delhi"} fmt.Println("Original map") /* print map */ for country := range countryCapitalMap { fmt.Println("Capital of",country,"is",countryCapitalMap[country]) } /* delete an entry */ delete(countryCapitalMap,"France"); fmt.Println("Entry for France is deleted") fmt.Println("Updated map") /* print map */ for country := range countryCapitalMap { fmt.Println("Capital of",country,"is",countryCapitalMap[country]) } }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Original Map Capital of France is Paris Capital of Italy is Rome Capital of Japan is Tokyo Capital of India is New Delhi Entry for France is deleted Updated Map Capital of India is New Delhi Capital of Italy is Rome Capital of Japan is Tokyo
Go — рекурсия
Рекурсия — это процесс повторения предметов самоподобным способом. Та же концепция применима и к языкам программирования. Если программа позволяет вызывать функцию внутри той же самой функции, то это называется рекурсивным вызовом функции. Взгляните на следующий пример —
func recursion() { recursion() /* function calls itself */ } func main() { recursion() }
Язык программирования Go поддерживает рекурсию. То есть это позволяет функции вызывать себя. Но при использовании рекурсии программистам нужно быть осторожными, чтобы определить условие выхода из функции, иначе оно станет бесконечным циклом.
Примеры рекурсии в го
Рекурсивные функции очень полезны для решения многих математических задач, таких как вычисление факториала числа, генерация ряда Фибоначчи и т. Д.
Пример 1: Расчет факториала с использованием рекурсии в Go
В следующем примере вычисляется факториал данного числа с использованием рекурсивной функции —
package main import "fmt" func factorial(i int)int { if(i <= 1) { return 1 } return i * factorial(i - 1) } func main() { var i int = 15 fmt.Printf("Factorial of %d is %d", i, factorial(i)) }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Factorial of 15 is 2004310016
Пример 2: ряд Фибоначчи с использованием рекурсии в го
В следующем примере показано, как сгенерировать ряд Фибоначчи для заданного числа с помощью рекурсивной функции —
package main import "fmt" func fibonaci(i int) (ret int) { if i == 0 { return 0 } if i == 1 { return 1 } return fibonaci(i-1) + fibonaci(i-2) } func main() { var i int for i = 0; i < 10; i++ { fmt.Printf("%d ", fibonaci(i)) } }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
0 1 1 2 3 5 8 13 21 34
Go — Type Casting
Приведение типов — это способ преобразования переменной из одного типа данных в другой тип данных. Например, если вы хотите сохранить длинное значение в простое целое число, вы можете набрать cast long для int. Вы можете конвертировать значения из одного типа в другой, используя оператор приведения . Его синтаксис выглядит следующим образом —
type_name(expression)
пример
Рассмотрим следующий пример, где оператор приведения заставляет деление одной целочисленной переменной на другую как операцию с плавающей точкой.
package main import "fmt" func main() { var sum int = 17 var count int = 5 var mean float32 mean = float32(sum)/float32(count) fmt.Printf("Value of mean : %f\n",mean) }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Value of mean : 3.400000
Go — Интерфейсы
Go-программирование предоставляет другой тип данных, называемый интерфейсами, который представляет собой набор сигнатур методов. Тип данных struct реализует эти интерфейсы, чтобы иметь определения методов для сигнатуры методов интерфейсов.
Синтаксис
/* define an interface */ type interface_name interface { method_name1 [return_type] method_name2 [return_type] method_name3 [return_type] ... method_namen [return_type] } /* define a struct */ type struct_name struct { /* variables */ } /* implement interface methods*/ func (struct_name_variable struct_name) method_name1() [return_type] { /* method implementation */ } ... func (struct_name_variable struct_name) method_namen() [return_type] { /* method implementation */ }
пример
package main import ( "fmt" "math" ) /* define an interface */ type Shape interface { area() float64 } /* define a circle */ type Circle struct { x,y,radius float64 } /* define a rectangle */ type Rectangle struct { width, height float64 } /* define a method for circle (implementation of Shape.area())*/ func(circle Circle) area() float64 { return math.Pi * circle.radius * circle.radius } /* define a method for rectangle (implementation of Shape.area())*/ func(rect Rectangle) area() float64 { return rect.width * rect.height } /* define a method for shape */ func getArea(shape Shape) float64 { return shape.area() } func main() { circle := Circle{x:0,y:0,radius:5} rectangle := Rectangle {width:10, height:5} fmt.Printf("Circle area: %f\n",getArea(circle)) fmt.Printf("Rectangle area: %f\n",getArea(rectangle)) }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Circle area: 78.539816 Rectangle area: 50.000000
Go — Обработка ошибок
Go-программирование предоставляет довольно простую структуру обработки ошибок со встроенным интерфейсом ошибок следующего типа:
type error interface { Error() string }
Функции обычно возвращают ошибку как последнее возвращаемое значение. Используйте errors.New, чтобы создать основное сообщение об ошибке следующим образом:
func Sqrt(value float64)(float64, error) { if(value < 0){ return 0, errors.New("Math: negative number passed to Sqrt") } return math.Sqrt(value) }
Используйте возвращаемое значение и сообщение об ошибке.
result, err:= Sqrt(-1) if err != nil { fmt.Println(err) }
пример
package main import "errors" import "fmt" import "math" func Sqrt(value float64)(float64, error) { if(value < 0){ return 0, errors.New("Math: negative number passed to Sqrt") } return math.Sqrt(value), nil } func main() { result, err:= Sqrt(-1) if err != nil { fmt.Println(err) } else { fmt.Println(result) } result, err = Sqrt(9) if err != nil { fmt.Println(err) } else { fmt.Println(result) } }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —