From 136c04f71adf3611d94c33552aebb63290647580 Mon Sep 17 00:00:00 2001
From: Rob Pike go
command for building Go programs and the new binary
release process being introduced. Most of these topics have more
thorough presentations elsewhere; such documents are linked below.
+
+The append
built-in function is variadic, so one can
+append to a byte slice using the ...
syntax in the
+call.
+
greeting := []byte{} + greeting = append(greeting, []byte("hello ")...) ++ +
+By analogy with the similar property of copy
, Go 1
+permits a string to be appended (byte-wise) directly to a byte
+slice; the conversion is no longer necessary:
+
greeting = append(greeting, "world"...) ++ +
+Updating: +This is a new feature, so existing code needs no changes. +
+
+The close
built-in function lets a sender tell a receiver
+that no more data will be transmitted on the channel. In Go 1 the
+type system enforces the directionality when possible: it is illegal
+to call close
on a receive-only channel:
+
+ var c chan int + var csend chan<- int = c + var crecv <-chan int = c + close(c) // legal + close(csend) // legal + close(crecv) // illegal ++ +
+Updating: +Existing code that attempts to close a receive-only channel was +erroneous even before Go 1 and should be fixed. The compiler will +now reject such code. +
+
+Go 1 allows goroutines to be created and run during initialization.
+(They used to be created but were not run until after initialization
+completed.) Code that uses goroutines can now be called from
+init
routines and global initialization expressions
+without introducing a deadlock.
+
var PackageGlobal int + +func init() { + c := make(chan int) + go initializationFunction(c) + PackageGlobal = <-c +} ++ +
+Updating:
+This is a new feature, so existing code needs no changes,
+although it's possible that code that depends on goroutines not starting before main
will break.
+There was no such code in the standard repository.
+
+In Go 1, the order in which elements are visited when iterating
+over a map using a for
range
statement
+is defined to be unpredictable, even if the same loop is run multiple
+times with the same map.
+Code should not assume that the elements are visited in any particular order.
+
m := map[string]int{"Sunday": 0, "Monday": 1} + for name, value := range m { + // This loop should not assume Sunday will be visited first. + f(name, value) + } ++ +
+Updating: +This is one change where tools cannot help. Most existing code +will be unaffected, but some programs may break or misbehave; we +recommend manual checking of all range statements over maps to +verify they do not depend on iteration order. There were a few such +examples in the standard repository; they have been fixed. +Note that it was already incorrect to depend on the iteration order, which +was unspecified. This change codifies the unpredictability. +
+Go 1 fully specifies the evaluation order in multiple assignment +statements. In particular, if the left-hand side of the assignment +statement contains expressions that require evaluation, such as +function calls or array indexing operations, these will all be done +using the usual left-to-right rule before any variables are assigned +their value. Once everything is evaluated, the actual assignments +proceed in left-to-right order. +
+ ++These examples illustrate the behavior. +
+ +sa := []int{1, 2, 3} + i := 0 + i, sa[i] = 1, 2 // sets i = 1, sa[0] = 2 + + sb := []int{1, 2, 3} + j := 0 + sb[j], j = 2, 1 // sets sb[0] = 2, j = 1 + + sc := []int{1, 2, 3} + sc[0], sc[0] = 1, 2 // sets sc[0] = 1, then sc[0] = 2 (so sc[0] = 2 at end) ++ +Updating: +This is one change where tools cannot help, but breakage is unlikely. +No code in the standard repository was broken by this change, and code +that depended on the previous unspecified behavior was already incorrect. + +
+A shadowed variable is one that has the same name as another variable in an inner scope. +In functions with named return values, +the Go 1 compilers disallow return statements without arguments if any of the named return values is shadowed at the point of the return statement. +(It isn't part of the specification, because this is one area we are still exploring; +the situation is analogous to the compilers rejecting functions that do not end with an explicit return statement.) +
+ ++This function implicitly returns a shadowed return value and will be rejected by the compiler: +
+ ++ func Bug() (i, j, k int) { + for i = 0; i < 5; i++ { + for j := 0; j < 5; j++ { // Redeclares j. + k += i*j + if k > 100 { + return // Rejected: j is shadowed here. + } + } + } + return // OK: j is not shadowed here. + } ++ +
+Updating: +Code that shadows return values in this way will be rejected by the compiler and will need to be fixed by hand. +The few cases that arose in the standard repository were mostly bugs. +
+ +
+Go 1 defines equality and inequality (==
and
+!=
) for struct and array values, respectively, provided
+the elements of the data structures can themselves be compared.
+That is, if equality is defined for all the fields of a struct (or
+an array element), then it is defined for the struct (or array).
+
+As a result, structs and arrays can now be used as map keys: +
+ +// type Day struct { + // long string + // short string + // } + // Christmas := Day{"Christmas", "XMas"} + // Thanksgiving := Day{"Thanksgiving", "Turkey"} + // holiday := map[Day]bool { + // Christmas: true, + // Thanksgiving: true, + // } + // fmt.Printf("Christmas is a holiday: %t\n", holiday[Christmas]) ++ +
+Note that equality is still undefined for slices, for which the
+calculation is in general infeasible. Also note that the ordered
+comparison operators (<
<=
+>
>=
) are still undefined for
+structs and arrays.
+
+
+Updating: +This is a new feature, so existing code needs no changes. +
+ +
+Go 1 disallows checking for equality of functions and maps,
+respectively, except to compare them directly to nil
.
+
+Updating: +Existing code that depends on function or map equality will be +rejected by the compiler and will need to be fixed by hand. +Few programs will be affected, but the fix may require some +redesign. +
+go
command for building Go programs and the new binary
release process being introduced. Most of these topics have more
thorough presentations elsewhere; such documents are linked below.
+
+The append
built-in function is variadic, so one can
+append to a byte slice using the ...
syntax in the
+call.
+
+By analogy with the similar property of copy
, Go 1
+permits a string to be appended (byte-wise) directly to a byte
+slice; the conversion is no longer necessary:
+
+Updating: +This is a new feature, so existing code needs no changes. +
+
+The close
built-in function lets a sender tell a receiver
+that no more data will be transmitted on the channel. In Go 1 the
+type system enforces the directionality when possible: it is illegal
+to call close
on a receive-only channel:
+
+ var c chan int + var csend chan<- int = c + var crecv <-chan int = c + close(c) // legal + close(csend) // legal + close(crecv) // illegal ++ +
+Updating: +Existing code that attempts to close a receive-only channel was +erroneous even before Go 1 and should be fixed. The compiler will +now reject such code. +
+
+Go 1 allows goroutines to be created and run during initialization.
+(They used to be created but were not run until after initialization
+completed.) Code that uses goroutines can now be called from
+init
routines and global initialization expressions
+without introducing a deadlock.
+
+Updating:
+This is a new feature, so existing code needs no changes,
+although it's possible that code that depends on goroutines not starting before main
will break.
+There was no such code in the standard repository.
+
+In Go 1, the order in which elements are visited when iterating
+over a map using a for
range
statement
+is defined to be unpredictable, even if the same loop is run multiple
+times with the same map.
+Code should not assume that the elements are visited in any particular order.
+
+Updating: +This is one change where tools cannot help. Most existing code +will be unaffected, but some programs may break or misbehave; we +recommend manual checking of all range statements over maps to +verify they do not depend on iteration order. There were a few such +examples in the standard repository; they have been fixed. +Note that it was already incorrect to depend on the iteration order, which +was unspecified. This change codifies the unpredictability. +
+Go 1 fully specifies the evaluation order in multiple assignment +statements. In particular, if the left-hand side of the assignment +statement contains expressions that require evaluation, such as +function calls or array indexing operations, these will all be done +using the usual left-to-right rule before any variables are assigned +their value. Once everything is evaluated, the actual assignments +proceed in left-to-right order. +
+ ++These examples illustrate the behavior. +
+ +{{code "progs/go1.go" `/sa :=/` `/then sc.0. = 2/`}} + +Updating: +This is one change where tools cannot help, but breakage is unlikely. +No code in the standard repository was broken by this change, and code +that depended on the previous unspecified behavior was already incorrect. + ++A shadowed variable is one that has the same name as another variable in an inner scope. +In functions with named return values, +the Go 1 compilers disallow return statements without arguments if any of the named return values is shadowed at the point of the return statement. +(It isn't part of the specification, because this is one area we are still exploring; +the situation is analogous to the compilers rejecting functions that do not end with an explicit return statement.) +
+ ++This function implicitly returns a shadowed return value and will be rejected by the compiler: +
+ ++ func Bug() (i, j, k int) { + for i = 0; i < 5; i++ { + for j := 0; j < 5; j++ { // Redeclares j. + k += i*j + if k > 100 { + return // Rejected: j is shadowed here. + } + } + } + return // OK: j is not shadowed here. + } ++ +
+Updating: +Code that shadows return values in this way will be rejected by the compiler and will need to be fixed by hand. +The few cases that arose in the standard repository were mostly bugs. +
+ +
+Go 1 defines equality and inequality (==
and
+!=
) for struct and array values, respectively, provided
+the elements of the data structures can themselves be compared.
+That is, if equality is defined for all the fields of a struct (or
+an array element), then it is defined for the struct (or array).
+
+As a result, structs and arrays can now be used as map keys: +
+ +{{code "progs/go1.go" `/type Day struct/` `/Printf/`}} + +
+Note that equality is still undefined for slices, for which the
+calculation is in general infeasible. Also note that the ordered
+comparison operators (<
<=
+>
>=
) are still undefined for
+structs and arrays.
+
+
+Updating: +This is a new feature, so existing code needs no changes. +
+ +
+Go 1 disallows checking for equality of functions and maps,
+respectively, except to compare them directly to nil
.
+
+Updating: +Existing code that depends on function or map equality will be +rejected by the compiler and will need to be fixed by hand. +Few programs will be affected, but the fix may require some +redesign. +
+