Add description of type conversions.

SVN=116978
This commit is contained in:
Rob Pike 2008-04-27 18:32:47 -07:00
parent 1265a0c22d
commit f53db3eaa9

View file

@ -1082,7 +1082,8 @@ Expression syntax is based on that of C but with fewer precedence levels.
Expression "." "(" Type ")" .
Call = Expression "(" [ ExpressionList ] ")" .
Conversion = TypeName "(" [ ExpressionList ] ")" .
Conversion = TypeName "(" Expression ")" |
"convert" "(" Type "," Expression ")" .
Allocation = "new" "(" Type [ "," Expression ] ")" .
binary_op = log_op | rel_op | add_op | mul_op .
@ -1211,6 +1212,37 @@ buffered channels, and maps.
TODO: argument order for dimensions in multidimensional arrays
Conversions
----
There are three ways to convert a value from one type to another.
The most general is a call to the intrinsic special function "convert"
with arguments the type name and the value to be converted.
var i int = convert(int, PI * 1000.0);
chars_as_ints := convert([]int, "now is the time");
If the destination type is a known type name, the conversion can be
rewritten to look syntactically like a call to a function with that
name.
i := int(PI * 1000.0);
s := AStructType(an_interface_variable);
A conversion can be written as a parenthesized type after a period.
Although intended for ease of conversion within a method call chain,
this form works in any expression context.
var s *AStructType = vec.index(2).(*AStructType);
fld := vec.index(2).(*AStructType).field;
f := 1000.(float);
TODO: are there parameters to any conversions? go.y has oexpr_list as the
contents of a TypeName() conversion; i expected expr instead and that's what
the others have.
The constant generator 'iota'
----
@ -1733,4 +1765,5 @@ TODO
- TODO: type switch?
- TODO: words about slices
- TODO: I (gri) would like to say that sizeof(int) == sizeof(pointer), always.
- TODO: when are two types equal? consider
func iterate(f *func(int, interface{}), arg interface{})