Мы рассмотрели две фундаментальные инструкции управления потоком, if
и for
, но не
инструкцию switch
, которая представляет собой инструкцию множественного ветвления.
package main
func main() {
switch coinflip() {
case "heads":
heads++
case "tails":
tails++
default:
fmt.Println("Приземлились!")
}
}
Результат вызова coinflip сравнивается со значением в каждой части case
. Значения проверяются сверху вниз, и при
первом найденном совпадении выполняется соответствующий код.
Необязательный вариант default
выполняется, если нет совпадений. Он может находиться где угодно.
Инструкция switch
может обойтись и без операнда, она может просто перечислять различные инструкции case
, каждая из
которых, при этом, представляет собой логическое выражение:
package main
func Signum(x int) int {
switch {
case x > 0:
return +1
default:
return 0
case x < 0:
return 1
}
}
Такая инструкция называется переключатель без тегов. Она эквивалентна конструкции switch true
.
Инструкции break
и continue
модифицируют поток управления. Инструкция break
заставляет передать управление
следующей инструкции после наиболее глубоко вложенной инструкции for
, switch
или select
.
Инструкция continue
заставляет наиболее глубоко вложенный цикл for
начать очередную итерацию.
Инструкции могут иметь метки, так что break
и continue
могут на них ссылаться, например для одновременного
прекращения работы нескольких вложенных циклов или для начала очередной итерации внешнего цикла.
Имеется инструкция goto
, она предназначена для машинно-генерируемого кода, а не для использования программистами.
Объявление type
позволяет присваивать имена существующим типам. Так, как структурные типы зачастую длинны, они почти
всегда именованны.
Простейший пример - определение типа Point
для двумерной графики:
package main
type Point struct {
X, Y int
}
var p Point
Go предоставляет указатели, т.е. значения, содержащие адреса переменных. Указатели являются явно видимыми.
Оператор &
дает адрес переменной, а оператор *
позволяет получить значение переменной, на которую указывает
указатель.
Но, арифметики указателей в Go нет.
Метод - представляет собой функцию, связанную с именованным типом. Go необычен тем, что методы могут быть связанны почти с любым именованным типом. Интерфейс - представляет собой абстрактные типы, которые позволяют рассматривать различные конкретные типы одинаково, на основе имеющихся у них методов, без учета того, как они представлены или реализованы.
Go поставляется с обширной стандартной библиотекой полезных пакетов. Еще, множество пакетов создано и распространено сообществом пользователей Go. Программирование чаще состоит в использовании существующих пакетов, чем в написании исходного кода собственных пакетов.
Хороший стиль требует написания комментария перед объявлением каждой функции, описывающим ее поведение. Это важные
соглашения, т.к. они используются такими инструментами как go doc
и godoc
, для поиска и отображения документации.
Для многострочных комментариев можно использовать запись /*...*/
. Такие комментарии иногда используются в начале файла
для большого блока пояснительного текста, чтобы избежать символов //
в начале каждой строки.
- Инструкция
switch
представляет собой инструкцию множественного ветвления. Результат вызова функции или значения сравнивается со значением в каждой частиcase
; - Значения проверяются
сверху вниз
, и при первом найденном совпадении выполняется соответствующий код. Необязательный вариантdefault
выполняется, еслинет совпадений
; - Инструкция
switch
может обойтись ибез операнда
и просто перечислять различные инструкцииcase
, каждая из которых представляет собой логическое выражение. Такая инструкция называетсяпереключатель без тегов
; - Инструкции
break
иcontinue
модифицируют поток управления. Инструкцияbreak
передает управление следующей инструкции после наиболее глубоко вложенной инструкцииfor
,switch
илиselect
. Инструкцияcontinue
заставляет наиболее глубоко вложенный циклfor
начать очередную итерацию; - Инструкции могут иметь
метки
, так чтоbreak
иcontinue
могут на них ссылаться. Имеется инструкцияgoto
, она предназначена для машинно-генерируемого кода; - Объявление
type
позволяет присваивать имена существующим типам. Структурные типы зачастую длинны, поэтому они почти всегда именованны; - Go предоставляет
указатели
-значения, содержащие адреса переменных
. Оператор&
дает адрес переменной, а оператор*
позволяет получить значение переменной, на которую указывает указатель. Однако, арифметики указателей в Go нет;* Метод представляет собой функцию, связанную с именованным типом. Методы могут быть связаны почти с любым именованным типом; Интерфейс
представляет собойабстрактные типы
, которые позволяют рассматривать различные конкретные типы одинаково, на основе имеющихся у них методов;- Go поставляется с обширной стандартной библиотекой полезных пакетов. Программирование часто состоит в использовании существующих пакетов;
- Хороший стиль требует написания комментария перед объявлением каждой функции, описывающим ее поведение. Это важно для
инструментов
go doc
иgodoc
, которые используются для поиска и отображения документации. Для многострочных комментариев можно использовать запись/*...*/
.