From: griesemer 3.0 can be given any integer or any
-floating-point type, while 2147483648.0 (equal to 1<<31)
-can be given the types float32, float64, or uint32 but
-not int32 or string.
+cannot be represented as a value of the respective type.
@@ -861,7 +857,8 @@ ElementType = Type .
The length is part of the array's type; it must evaluate to a
-non-negative constant representable by a value
+non-negative constant
+representable by a value
of type int.
The length of array a can be discovered
using the built-in function len.
@@ -1514,7 +1511,7 @@ are different because B0 is different from []string.
A value x is assignable to a variable of type T
-("x is assignable to T") in any of these cases:
+("x is assignable to T") if one of the following conditions applies:
V or T is not a defined type.
is a pointer, function, slice, map, channel, or interface type.
x is an untyped constant representable
+x is an untyped constant
+representable
by a value of type T.
+A constant x is representable
+by a value of type T if one of the following conditions applies:
+
x is in the set of values determined by T.
+T is a floating-point type and x can be rounded to T's
+precision without overflow. Rounding uses IEEE 754 round-to-even rules but with an IEEE
+negative zero further simplified to an unsigned zero. Note that constant values never result
+in an IEEE negative zero, NaN, or infinity.
+T is a complex type, and x's
+components real(x) and imag(x)
+are representable by values of T's component type (float32 or
+float64).
++x T x is representable by a value of T because + +'a' byte 97 is in the set of byte values +97 rune rune is an alias for int32, and 97 is in the set of 32-bit integers +"foo" string "foo" is in the set of string values +1024 int16 1024 is in the set of 16-bit integers +42.0 byte 42 is in the set of unsigned 8-bit integers +1e10 uint64 10000000000 is in the set of unsigned 64-bit integers +2.718281828459045 float32 2.718281828459045 rounds to 2.7182817 which is in the set of float32 values +-1e-1000 float64 -1e-1000 rounds to IEEE -0.0 which is further simplified to 0.0 +0i int 0 is an integer value +(42 + 0i) float32 42.0 (with zero imaginary part) is in the set of float32 values ++ +
+x T x is not representable by a value of T because + +0 bool 0 is not in the set of boolean values +'a' string 'a' is a rune, it is not in the set of string values +1024 byte 1024 is not in the set of unsigned 8-bit integers +-1 uint16 -1 is not in the set of unsigned 16-bit integers +1.1 int 1.1 is not an integer value +42i float32 (0 + 42i) is not in the set of float32 values +1e1000 float64 1e1000 overflows to IEEE +Inf after rounding ++ +
@@ -2348,7 +2401,8 @@ For array and slice literals the following rules apply: its position in the array.
int; and if it is typed
it must be of integer type.
a is not a map:
it is in range if 0 <= x < len(a),
otherwise it is out of range
int
+ and representable by a value
+ of type int
@@ -3075,7 +3130,8 @@ For arrays or strings, the indices are in range if
The indices are in range if
The right operand in a shift expression must have unsigned integer type
-or be an untyped constant representable by a value of type
A constant value
Converting a constant yields a typed constant as result.
-The values of typed constants must always be accurately representable as values
+The values of typed constants must always be accurately
+representable by values
of the constant type. The following constant expressions are illegal:
The size arguments 0 <= low <= high <= len(a),
otherwise they are out of range.
For slices, the upper index bound is the slice capacity cap(a) rather than the length.
-A constant index must be non-negative and representable by a value of type
+A constant index must be non-negative and
+representable by a value of type
int; for arrays or constant strings, constant indices must also be in range.
If both indices are constant, they must satisfy low <= high.
If the indices are out of range at run time, a run-time panic occurs.
@@ -3135,7 +3191,8 @@ If the sliced operand is an array, it must be addre
0 <= low <= high <= max <= cap(a),
otherwise they are out of range.
-A constant index must be non-negative and representable by a value of type
+A constant index must be non-negative and
+representable by a value of type
int; for arrays, constant indices must also be in range.
If multiple indices are constant, the constants that are present must be in range relative to each
other.
@@ -3384,7 +3441,8 @@ to the type of the other operand.
uint.
+or be an untyped constant representable by a
+value of type uint.
If the left operand of a non-constant shift expression is an untyped constant,
it is first converted to the type it would assume if the shift expression were
replaced by its left operand alone.
@@ -3877,30 +3935,14 @@ func() int(x) // x is converted to func() int (unambiguous)
x can be converted to
-type T in any of these cases:
+type T if x is representable
+by a value of T.
+As a special case, an integer constant x can be converted to a
+string type using the
+same rule
+as for non-constant x.
-
-
x is representable by a value of type T.
- x is a floating-point constant,
- T is a floating-point type,
- and x is representable by a value
- of type T after rounding using
- IEEE 754 round-to-even rules, but with an IEEE -0.0
- further rounded to an unsigned 0.0.
- The constant T(x) is the rounded value.
- x is an integer constant and T is a
- string type.
- The same rule
- as for non-constant x applies in this case.
- n and m must be of integer type or untyped.
A constant size argument must be non-negative and
-representable by a value of type int.
+representable by a value of type int.
If both n and m are provided and are constant, then
n must be no larger than m.
If n is negative or larger than m at run time,