Преобразование изменяет тип выражения на тип, указанный преобразованием. Преобразование может появиться буквально в источнике, или это может подразумеваться контекстом, в котором появляется выражение.
Явное преобразование - это выражение в форме T(x), где T - это тип, а x - это выражение, которое можно преобразовать в тип T.
Conversion = Type "(" Expression [ "," ] ")" .
Если тип начинается с оператора * или <-, или если тип начинается с ключевого слова func и не имеет списка результатов, его необходимо заключить в скобки когда необходимо, чтобы избежать двусмысленности:
*Point(p)        // тоже что и *(Point(p))
(*Point)(p)      // p преобразовано в *Point
<-chan int(c)    // тоже что и <-(chan int(c))
(<-chan int)(c)  // c преобразовано в <-chan int
func()(x)        // сигнатура функции func() x
(func())(x)      // x преобразовано в func()
(func() int)(x)  // x преобразовано в func() int
func() int(x)    // x преобразовано в func() int (однозначно)
Постоянное значение x может быть преобразовано в тип T, если x представимо значением T. В особом случае целочисленная константа x может быть явно преобразована в строковый тип, используя то же правило, что и для непостоянной переменной x.
Преобразование константы дает типизированную константу как результат.
uint(iota)               // iota значение типа uint
float32(2.718281828)     // 2.718281828 типа float32
complex128(1)            // 1.0 + 0.0i типа complex128
float32(0.49999999)      // 0.5 типа float32
float64(-1e-1000)        // 0.0 типа float64
string('x')              // "x" типа string
string(0x266c)           // "♬" типа string
MyString("foo" + "bar")  // "foobar" типа MyString
string([]byte{'a'})      // не константа: []byte{'a'} это не константа
(*int)(nil)              // не константа: nil это не константа, *int это не boolean, numeric, или string тип
int(1.2)                 // недопустимо: 1.2 не может быть представлено как int
string(65.0)             // недопустимо: 65.0 iэто не integer константа
Непостоянное (non-constant) значение x может быть преобразовано в тип T в любом из следующих случаев:
- х присваиваемо (assignable) Т.
 - игнорируя теги struct, тип x и T имеют идентичные базовые типы.
 - игнорируя теги struct, тип x и T являются типами указателей, которые не являются определенными типами, и их базовые типы указателей имеют идентичные базовые типы.
 - Тип x и T оба являются целочисленными или числами с плавающей точкой.
 - Тип x и T оба являются сложными типами.
 - x - целое число или срез байтов или рун, а T - строковый тип.
 - x - это строка, а T - срез байтов или рун.
 
Структурные теги игнорируются при сравнении структурных типов на идентичность с целью преобразования:
type Person struct {
  Name    string
  Address *struct {
    Street string
    City   string
  }
}
var data *struct {
  Name    string `json:"name"`
  Address *struct {
    Street string `json:"street"`
    City   string `json:"city"`
  } `json:"address"`
}
// игнорируя теги, базовые типы идентичны
var person = (*Person)(data)  
Особые правила применяются к (неконстантным) преобразованиям между числовыми типами или в и из строкового типа. Эти преобразования могут изменить представление x и повлечь за собой затраты времени выполнения. Все остальные преобразования изменяют только тип, но не представление x.
Нет лингвистического механизма для преобразования между указателями и целыми числами. Небезопасный пакет реализует эту функциональность при ограниченных обстоятельствах.
Читайте также:
- Спецификация Go: утверждения типа (type assertions)
 - Спецификация Go: объявление типа
 - Спецификация Go: логические операторы, адресные операторы
 

Комментариев нет:
Отправить комментарий