Commit 4dc2528a authored by Robert Griesemer's avatar Robert Griesemer

- added missing language to almost all types

- fixed several examples to use new function type syntax
- added list of open spec issues to todo.txt

R=r
DELTA=143  (88 added, 8 deleted, 47 changed)
OCL=14974
CL=15007
parent 24838a2d
...@@ -93,6 +93,9 @@ Contents ...@@ -93,6 +93,9 @@ Contents
Function declarations Function declarations
Methods (type-bound functions) Methods (type-bound functions)
Predeclared functions Predeclared functions
Length and capacity
Conversions
Allocation
Packages Packages
...@@ -675,7 +678,7 @@ Basic types ...@@ -675,7 +678,7 @@ Basic types
Go defines a number of basic types, referred to by their predeclared Go defines a number of basic types, referred to by their predeclared
type names. These include traditional arithmetic types, booleans, type names. These include traditional arithmetic types, booleans,
strings, and a special polymorphic type. and strings.
Arithmetic types Arithmetic types
...@@ -720,10 +723,8 @@ sized types to maximize portability. ...@@ -720,10 +723,8 @@ sized types to maximize portability.
Booleans Booleans
---- ----
bool the truth values true and false The type "bool" comprises the truth values true and false, which are
available through the two predeclared constants, "true" and "false".
Two predeclared constants, ``true'' and ``false'', represent the
corresponding boolean constant values.
Strings Strings
...@@ -739,9 +740,9 @@ element of a string. ...@@ -739,9 +740,9 @@ element of a string.
- They can be indexed: given string "s1", "s1[i]" is a byte value. - They can be indexed: given string "s1", "s1[i]" is a byte value.
- They can be concatenated: given strings "s1" and "s2", "s1 + s2" is a value - They can be concatenated: given strings "s1" and "s2", "s1 + s2" is a value
combining the elements of "s1" and "s2" in sequence. combining the elements of "s1" and "s2" in sequence.
- Known length: the length of a string "s1" can be obtained by the function/ - Known length: the length of a string "s1" can be obtained by calling
operator "len(s1)". The length of a string is the number of bytes within. "len(s1)". The length of a string is the number
Unlike in C, there is no terminal NUL byte. of bytes within. Unlike in C, there is no terminal NUL byte.
- Creation 1: a string can be created from an integer value by a conversion; - Creation 1: a string can be created from an integer value by a conversion;
the result is a string containing the UTF-8 encoding of that code point. the result is a string containing the UTF-8 encoding of that code point.
"string('x')" yields "x"; "string(0x1234)" yields the equivalent of "\u1234" "string('x')" yields "x"; "string(0x1234)" yields the equivalent of "\u1234"
...@@ -891,14 +892,20 @@ to arrays and arrays. ...@@ -891,14 +892,20 @@ to arrays and arrays.
Struct types Struct types
---- ----
Struct types are similar to C structs. A struct is a composite type consisting of a fixed number of elements,
called fields, with possibly different types. The struct type declaration
Each field of a struct represents a variable within the data specifies the name and type for each field. The scope of each field identifier
structure. extends from the point of the declaration to the end of the struct type, but
it is also visible within field selectors (see Primary Expressions).
StructType = "struct" "{" [ FieldDeclList [ ";" ] ] "}" . StructType = "struct" "{" [ FieldDeclList [ ";" ] ] "}" .
FieldDeclList = FieldDecl { ";" FieldDecl } . FieldDeclList = FieldDecl { ";" FieldDecl } .
FieldDecl = IdentifierList Type . FieldDecl = IdentifierList FieldType .
FieldType = Type .
Type equality: Two struct types are equal only if both have the same number
of fields in the same order and and the field types are equal
(note that the field names do not have to match).
// An empty struct. // An empty struct.
struct {} struct {}
...@@ -907,24 +914,27 @@ structure. ...@@ -907,24 +914,27 @@ structure.
struct { struct {
x, y int; x, y int;
u float; u float;
a []int; a *[]int;
f func(); f *();
} }
Assignment compatibility: Structs are assignment compatible to variables of
equal type only.
Pointer types Pointer types
---- ----
Pointer types are similar to those in C. A pointer type denotes the set of all pointers to variables of a given
type, called the ``base type'' of the pointer, and the value "nil".
PointerType = "*" ElementType. PointerType = "*" BaseType .
BaseType = Type .
Pointer arithmetic of any kind is not permitted.
*int *int
*map[string] *chan *map[string] *chan
For pointer types (only), the pointer element type may be an For pointer types (only), the pointer base type may be an
identifier referring to an incomplete (not yet fully defined) or undeclared identifier referring to an incomplete (not yet fully defined) or undeclared
type. This allows the construction of recursive and mutually recursive types type. This allows the construction of recursive and mutually recursive types
such as: such as:
...@@ -934,33 +944,51 @@ such as: ...@@ -934,33 +944,51 @@ such as:
type S1 struct { s2 *S2 } type S1 struct { s2 *S2 }
type S2 struct { s1 *S1 } type S2 struct { s1 *S1 }
If the element type is an undeclared identifier, the declaration implicitly If the base type is an undeclared identifier, the declaration implicitly
forward-declares an (incomplete) type with the respective name. By the end forward-declares an (incomplete) type with the respective name. Any such
of the package source, any such forward-declared type must be completely forward-declared type must be completely declared in the same or an outer
declared in the same or an outer scope. scope.
Type equality: Two pointer types are equal only if both have equal
base types.
Assignment compatibility: A pointer is assignment compatible to a variable
of pointer type, only if both types are equal.
Pointer arithmetic of any kind is not permitted.
Map types Map types
---- ----
A map is a composite type consisting of a variable number of entries A map is a composite type consisting of a variable number of entries
called (key, value) pairs. For a given map, called (key, value) pairs. For a given map, the keys and values must
the keys and values must each be of a specific type. each be of a specific type called the key and value type, respectively.
Upon creation, a map is empty and values may be added and removed Upon creation, a map is empty and values may be added and removed
during execution. The number of entries in a map is called its length. during execution. The number of entries in a map is called its length.
[OLD
A map whose value type is 'any' can store values of all types.
END]
MapType = "map" "[" KeyType "]" ValueType . MapType = "map" "[" KeyType "]" ValueType .
KeyType = Type . KeyType = Type .
ValueType = Type | "any" . ValueType = Type .
map [string] int map [string] int
map [struct { pid int; name string }] *chan Buffer map [struct { pid int; name string }] *chan Buffer
map [string] any map [string] any
Implementation restriction: Currently, only pointers to maps are supported. The length of a map "m" can be discovered using the built-in function
len(m)
Allocation: A map may only be used as a base type of a pointer type.
There are no variables, parameters, array, struct, or map fields of
map type, only of pointers to maps.
Type equivalence: Two map types are equal only if both have equal
key and value types.
Assignment compatibility: A pointer to a map type is assignment
compatible to a variable of pointer to map type only if both types
are equal.
Channel types Channel types
...@@ -1011,7 +1039,7 @@ Functions can return multiple values simultaneously. ...@@ -1011,7 +1039,7 @@ Functions can return multiple values simultaneously.
(a, b int, z float) (success bool, result float) (a, b int, z float) (success bool, result float)
A variable can hold only a pointer to a function, not a function value. A variable can hold only a pointer to a function, not a function value.
In particular, v := func() {} creates a variable of type *func(). To call the In particular, v := func() {} creates a variable of type *(). To call the
function referenced by v, one writes v(). It is illegal to dereference a function referenced by v, one writes v(). It is illegal to dereference a
function pointer. function pointer.
...@@ -1185,6 +1213,10 @@ Implementation restriction: A function literal can reference only ...@@ -1185,6 +1213,10 @@ Implementation restriction: A function literal can reference only
its parameters, global variables, and variables declared within the its parameters, global variables, and variables declared within the
function literal. function literal.
TODO: Should a function literal return a value of the function type
instead of the pointer to the function? Seems more consistent with
the other uses and composite literals.
Primary expressions Primary expressions
---- ----
...@@ -1282,7 +1314,7 @@ For instance, given a *Point variable pt, one may call ...@@ -1282,7 +1314,7 @@ For instance, given a *Point variable pt, one may call
The type of a method is the type of a function with the receiver as first The type of a method is the type of a function with the receiver as first
argument. For instance, the method "Scale" has type argument. For instance, the method "Scale" has type
func(p *Point, factor float) (p *Point, factor float)
However, a function declared this way is not a method. However, a function declared this way is not a method.
...@@ -1450,7 +1482,7 @@ taking the address of f with the expression ...@@ -1450,7 +1482,7 @@ taking the address of f with the expression
creates a pointer to the function that may be stored in a value of type pointer creates a pointer to the function that may be stored in a value of type pointer
to function: to function:
var fp *func(a int) int = &f; var fp *(a int) int = &f;
The function pointer may be invoked with the usual syntax; no explicit The function pointer may be invoked with the usual syntax; no explicit
indirection is required: indirection is required:
...@@ -1473,11 +1505,11 @@ To construct the address of method M, we write ...@@ -1473,11 +1505,11 @@ To construct the address of method M, we write
using the variable t (not the type T). The expression is a pointer to a using the variable t (not the type T). The expression is a pointer to a
function, with type function, with type
*func(t *T, a int) int *(t *T, a int) int
and may be invoked only as a function, not a method: and may be invoked only as a function, not a method:
var f *func(t *T, a int) int; var f *(t *T, a int) int;
f = &t.M; f = &t.M;
x := f(t, 7); x := f(t, 7);
...@@ -2075,6 +2107,21 @@ TODO: (gri) suggests that we should consider assert() as a built-in function. ...@@ -2075,6 +2107,21 @@ TODO: (gri) suggests that we should consider assert() as a built-in function.
It is like panic, but takes a guard as first argument. It is like panic, but takes a guard as first argument.
Length and capacity
----
The predeclared function "len()" takes a value of array or map type,
or of pointer to array or map type, and returns the number of array
of map elements.
The predeclared function "cap()" takes a value of array or pointer
to array type and returns the number of elements for which there
is space allocated in the array. For an array "a", at any time the
following relationship holds:
0 <= len(a) <= cap(a)
Conversions Conversions
---- ----
...@@ -2198,30 +2245,27 @@ in general. ...@@ -2198,30 +2245,27 @@ in general.
Allocation Allocation
---- ----
The builtin-function new() allocates storage. The function takes a The built-in function "new()" takes a type "T", optionally followed by a
parenthesized operand list comprising the type of the value to type-specific list of expressions. It allocates memory for a variable
allocate, optionally followed by type-specific expressions that of type "T" and returns a pointer of type "*T" to that variable. The
influence the allocation. The invocation returns a pointer to the memory is initialized as described in the section on initial values.
memory. The memory is initialized as described in the section on
initial values. new(type, [optional list of expressions])
For instance, For instance
type S struct { a int; b float } type S struct { a int; b float }
new(S) new(S)
allocates storage for an S, initializes it (a=0, b=0.0), and returns a dynamically allocates memory for a variable of type S, initializes it
value of type *S pointing to that storage. (a=0, b=0.0), and returns a value of type *S pointing to that variable.
The only defined parameters affect sizes for allocating arrays, The only defined parameters affect sizes for allocating arrays,
buffered channels, and maps. buffered channels, and maps.
ap := new([]int, 10); # a pointer to an array of 10 ints ap := new([]int, 10); # a pointer to an open array of 10 ints
aap := new([][]int, 5, 10); # a pointer to an array of 5 arrays of 10 ints
c := new(chan int, 10); # a pointer to a channel with a buffer size of 10 c := new(chan int, 10); # a pointer to a channel with a buffer size of 10
m := new(map[string] int, 100); # a pointer to a map with space for 100 elements preallocated m := new(map[string] int, 100); # a pointer to a map with initial space for 100 elements
TODO: argument order for dimensions in multidimensional arrays
Packages Packages
...@@ -2365,7 +2409,9 @@ be no cyclic dependencies in initialization. ...@@ -2365,7 +2409,9 @@ be no cyclic dependencies in initialization.
A complete program, possibly created by linking multiple packages, A complete program, possibly created by linking multiple packages,
must have one package called main, with a function must have one package called main, with a function
func main() { ... } func main() { ... }
defined. The function main.main() takes no arguments and returns no defined. The function main.main() takes no arguments and returns no
value. value.
...@@ -2606,7 +2652,7 @@ For instance, the struct type ...@@ -2606,7 +2652,7 @@ For instance, the struct type
struct { struct {
a int; a int;
b int; b int;
f *func (m *[32] float, x int, y int) bool f *(m *[32] float, x int, y int) bool
} }
is equivalent to is equivalent to
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment