Шаг 62.
Язык программирования Go.
Приведение типов

    На этом шаге рассмотрим приведение типов в Go.

    Множеством методов типа является множество всех методов, которые могут вызываться относительно значения этого типа. Для типов, не имеющих методов, это множество является пустым множеством.

    Тип interface{} в языке Go используется для представления пустого интерфейса, то есть значения типа, множество методов которого включает пустое множество. Поскольку любой тип имеет множество методов, включающее пустое множество (независимо от фактического количества методов), тип interface{} можно использовать для представления значения любого типа. Кроме того, значение типа interface{} можно преобразовать в значение фактического типа с помощью инструкции switch.

    Переменные типа interface{} (или типов пользовательских интерфейсов) могут потребоваться при обработке данных, получаемых из внешних источников, когда желательно создать набор обобщенных функций и в объектно-ориентированном программировании.

    Одним из способов доступа к лежащему в основе значению является использование операции приведения типа:

значениеТипа, логическое_значение := выражение.(Тип)  // Контролируемое приведение
значениеТипа := выражение.(Тип) // Неконтролируемое; вызывает panic() при ошибке

    В случае успеха контролируемого приведения типа возвращается значение выражения в виде значения указанного Типа и значение true, сообщающее об успехе. Если контролируемое приведение завершается неудачей (то есть тип выражения несовместим с указанным Типом), возвращается нулевое значение указанного Типа и false. Неконтролируемое приведение типа либо возвращает значение выражения в виде значения указанного Типа, либо вызывает встроенную функцию panic(), что ведет к завершению программы, если аварийную ситуацию своевременно не обработать.

    Приведем пример, иллюстрирующий использование этих приемов:

var i interface{} = 65000
var s interface{} = []string{"строка1", "строка2"}
j := i.(int) // j получит значение типа int (или будет вызвана функция panic())
fmt.Printf("%T->%d\n", j, j)
if i, ok := i.(int); ok {
   fmt.Printf("%T->%d\n", i, i) // i - затеняющая переменная типа int
}
if  s, ok := s.([]string); ok {
   fmt.Printf("%T->%q\n", s, s) // s - затеняющая переменная типа []string
/*При выводе оригинальных переменных i и s (обе имеют тип interface{})
они определяются как значения типов int и []string. Это объясняется тем,
что когда функции вывода из пакета fmt сталкиваются со значениями типа interface{},
они способны определять фактические значения.*/
}

    Архив примера можно взять здесь.

    При приведении типа для получения результата часто принято использовать переменные, имена которых совпадают с именами оригинальных переменных, то есть затеняющие переменные. И в целом операция приведения типа используется, только когда ожидается, что выражение будет иметь определенный тип. Если выражение может возвращать значение одного из нескольких типов, следует использовать инструкцию switch выбора по типу.

    На следующем шаге начнем рассматривать инструкции организации взаимодействий и параллельного выполнения в Go.


Предыдущий шаг Содержание Следующий шаг