четверг, 30 мая 2019 г.

Спецификация Go: свойства типов и значений - способность присвоения (assignability), представимость (representability)

Способность присвоения (Assignability)

Значение x способно к присваиванию переменной типа T ("x способно к присваиванию T", "x is assignable to T"), если применяется одно из следующих условий:

  • тип х идентичен T.
  • тип V значения x и тип T имеют идентичные базовые типы, и по крайней мере один из V или T не является определенным типом.
  • T является типом интерфейса, а x реализует T.
  • x - двунаправленное значение канала (bidirectional channel), T - тип канала, тип V значения x и T имеют идентичные типы элементов, и, по крайней мере, один из V или T не является определенным типом.
  • x - это предварительно объявленный идентификатор nil, а T - это указатель, функция, срез (slice), карта (map), канал или тип интерфейса.
  • x - нетипизированная константа, представимая значением типа T.

Представимость (Representability)

Константа x может быть представлена значением типа T, если выполняется одно из следующих условий:

  • х находится во множестве значений, определенных Т.
  • T является типом с плавающей точкой (floating-point type), и x может быть округлен до точности T без переполнения. При округлении используются правила округления до четности IEEE 754, но с отрицательным нулем IEEE, дополнительно упрощенным до нулевого знака. Обратите внимание, что постоянные значения никогда не приводят к отрицательному нулю IEEE, NaN или бесконечности.
  • T является сложным типом, а компоненты x: real(x) и imag(x) - представляются значениями типа компонента T (float32 или float64).

x                   T           x представима значением T потому что

'a'                 byte        97 это набор байтовых (byte) значений
97                  rune        rune это псевдоним int32, 
                                а 97 входит в набор 32-битных 
                                целых чисел (32-bit integers)
"foo"               string      "foo" входит в набор 
                                строовых (string) значений
1024                int16       1024 входит в набор 16-битных 
                                целых чисел (16-bit integers)
42.0                byte        42 входит в набор беззнаковых 
                                8-битных целых чисел 
                                (unsigned 8-bit integers)
1e10                uint64      10000000000 входит в набор 
                                беззнаковых 64-битных целых чисел 
                                (unsigned 64-bit integers)
2.718281828459045   float32     2.718281828459045 округляется 
                                до 2.7182817 которое входит 
                                в набор float32 значений
-1e-1000            float64     -1e-1000 округляется 
                                до IEEE -0.0 которое 
                                далее упрощается до 0.0
0i                  int         0 это целочисленное (integer) значение
(42 + 0i)           float32     42.0 (с нулевой мнимой (imaginary) частью) 
                                входит в набор float32 значений

x        T           x не представима значением T потому что

0        bool        0 не входит в набор boolean значений
'a'      string      'a' это rune, она не входит в набор 
                     строковых (string) значений
1024     byte        1024 не входит в набор беззнаковых 8-битных 
                     целых чисел (unsigned 8-bit integers)
-1       uint16      -1 не входит в набор беззнаковых 16-битных 
                     целых чисел (unsigned 16-bit integers)
1.1      int         1.1 это не цельночисловое (integer) значение
42i      float32     (0 + 42i) не входит в набор float32 значений
1e1000   float64     1e1000 переполняется до IEEE +Inf после округления


Читайте также:


Комментариев нет:

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