Skip to content

Latest commit

 

History

History

lesson8

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

1.8. Некоторые мелочи

Управление потоком

Мы рассмотрели две фундаментальные инструкции управления потоком, 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, которые используются для поиска и отображения документации. Для многострочных комментариев можно использовать запись /*...*/.