diff --git a/doc/go_tutorial.html b/doc/go_tutorial.html
index 822f9626ee7..42125cbbdb3 100644
--- a/doc/go_tutorial.html
+++ b/doc/go_tutorial.html
@@ -19,9 +19,6 @@ The presentation here proceeds through a series of modest programs to illustrate
key features of the language. All the programs work (at time of writing) and are
checked into the repository in the directory /doc/progs/
.
-Program snippets are annotated with the line number in the original file; for -cleanliness, blank lines remain blank. -
Let's start in the usual way: @@ -29,7 +26,7 @@ Let's start in the usual way:
package main -import fmt "fmt" // Package implementing formatted I/O. +import fmt "fmt" // Package implementing formatted I/O. func main() { fmt.Printf("Hello, world; or Καλημέρα κόσμε; or こんにちは 世界\n") @@ -121,18 +118,18 @@ Next up, here's a version of the Unix utilityecho(1)
: import ( "os" - "flag" // command line option parser + "flag" // command line option parser ) var omitNewline = flag.Bool("n", false, "don't print final newline") const ( - Space = " " + Space = " " Newline = "\n" ) func main() { - flag.Parse() // Scans the arg list and sets up flags + flag.Parse() // Scans the arg list and sets up flags var s string = "" for i := 0; i < flag.NArg(); i++ { if i > 0 { @@ -176,12 +173,13 @@ a naming conflict.Given
os.Stdout
we can use itsWriteString
method to print the string.-Having imported the
flag
package, line 12 creates a global variable to hold -the value of echo's-n
flag. The variableomitNewline
has type*bool
, pointer -tobool
. +After importing theflag
package, we use avar
declaration +to create and initialize a global variable, calledomitNewline
, +to hold the value of echo's-n
flag. +The variable has type*bool
, pointer tobool
.-In
main.main
, we parse the arguments (line 20) and then create a local -string variable we will use to build the output. +Inmain.main
, we parse the arguments (the call toflag.Parse
) and then create a local +string variable with which to build the output.The declaration statement has the form
@@ -261,7 +259,9 @@ reassigning it. This snippet from
strings.go
is legal code:
s := "hello" - if s[1] != 'e' { os.Exit(1) } + if s[1] != 'e' { + os.Exit(1) + } s = "good bye" var p *string = &s *p = "ciao" @@ -540,7 +540,7 @@ return nbut for simple structures like
File
it's easier to return the address of a -composite literal, as is done here on line 21. +composite literal, as is done here in thereturn
statement fromnewFile
.We can use the factory to construct some familiar, exported variables of type
*File
:@@ -573,9 +573,9 @@ multi-value return as a parenthesized list of declarations; syntactically they look just like a second parameter list. The function
syscall.Open
also has a multi-value return, which we can grab with the multi-variable -declaration on line 31; it declaresr
ande
to hold the two values, +declaration on the first line; it declaresr
ande
to hold the two values, both of typeint
(although you'd have to look at thesyscall
package -to see that). Finally, line 35 returns two values: a pointer to the newFile
+to see that). Finally,OpenFile
returns two values: a pointer to the newFile
and the error. Ifsyscall.Open
fails, the file descriptorr
will be negative andnewFile
will returnnil
.@@ -689,7 +689,7 @@ func main() { file.Stdout.Write(hello) f, err := file.Open("/does/not/exist") if f == nil { - fmt.Printf("can't open file; err=%s\n", err.String()) + fmt.Printf("can't open file; err=%s\n", err.String()) os.Exit(1) } } @@ -938,9 +938,9 @@ arrays of integers, strings, etc.; here's the code for arrays of
int
type IntSlice []int -func (p IntSlice) Len() int { return len(p) } -func (p IntSlice) Less(i, j int) bool { return p[i] < p[j] } -func (p IntSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } +func (p IntSlice) Len() int { return len(p) } +func (p IntSlice) Less(i, j int) bool { return p[i] < p[j] } +func (p IntSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
Here we see methods defined for non-struct
types. You can define methods
@@ -966,18 +966,18 @@ to implement the three methods for that type, like this:
type day struct { - num int - shortName string - longName string + num int + shortName string + longName string } type dayArray struct { data []*day } -func (p *dayArray) Len() int { return len(p.data) } -func (p *dayArray) Less(i, j int) bool { return p.data[i].num < p.data[j].num } -func (p *dayArray) Swap(i, j int) { p.data[i], p.data[j] = p.data[j], p.data[i] } +func (p *dayArray) Len() int { return len(p.data) } +func (p *dayArray) Less(i, j int) bool { return p.data[i].num < p.data[j].num } +func (p *dayArray) Swap(i, j int) { p.data[i], p.data[j] = p.data[j], p.data[i] }
@@ -1013,7 +1013,7 @@ can just say %d
; Printf
knows the size and signedness
integer and can do the right thing for you. The snippet
var u64 uint64 = 1<<64-1 +--> var u64 uint64 = 1<<64 - 1 fmt.Printf("%d %d\n", u64, int64(u64))
@@ -1183,7 +1183,7 @@ Here is the first function in progs/sieve.go
:
-->// Send the sequence 2, 3, 4, ... to channel 'ch'.
func generate(ch chan int) {
for i := 2; ; i++ {
- ch <- i // Send 'i' to channel 'ch'.
+ ch <- i // Send 'i' to channel 'ch'.
}
}
@@ -1203,9 +1203,9 @@ operator <-
(receive) retrieves the next value on the channel.
// removing those divisible by 'prime'.
func filter(in, out chan int, prime int) {
for {
- i := <-in // Receive value of new variable 'i' from 'in'.
- if i % prime != 0 {
- out <- i // Send 'i' to channel 'out'.
+ i := <-in // Receive value of new variable 'i' from 'in'.
+ if i%prime != 0 {
+ out <- i // Send 'i' to channel 'out'.
}
}
}
@@ -1238,8 +1238,8 @@ together:
func main() { - ch := make(chan int) // Create a new channel. - go generate(ch) // Start generate() as a goroutine. + ch := make(chan int) // Create a new channel. + go generate(ch) // Start generate() as a goroutine. for i := 0; i < 100; i++ { // Print the first hundred primes. prime := <-ch fmt.Println(prime) @@ -1262,7 +1262,7 @@ ofgenerate
, fromprogs/sieve1.go
:func generate() chan int { ch := make(chan int) - go func(){ + go func() { for i := 2; ; i++ { ch <- i } @@ -1288,7 +1288,7 @@ The same change can be made to@@ -1396,8 +1396,8 @@ does it check the results. req.replyc = make(chan int) adder <- req } - for i := N-1; i >= 0; i-- { // doesn't matter what order - if <-reqs[i].replyc != N + 2*i { + for i := N - 1; i >= 0; i-- { // doesn't matter what order + if <-reqs[i].replyc != N+2*i { fmt.Println("fail at", i) } } @@ -1425,7 +1425,7 @@ It passes the quit channel to thefilter
: out := make(chan int) go func() { for { - if i := <-in; i % prime != 0 { + if i := <-in; i%prime != 0 { out <- i } } @@ -1337,8 +1337,8 @@ that will be used for the reply.
type request struct { - a, b int - replyc chan int + a, b int + replyc chan int }@@ -1364,7 +1364,7 @@ a long-running operation, starting a goroutine to do the actual work. -->func server(op binOp, service chan *request) { for { req := <-service - go run(op, req) // don't wait for it + go run(op, req) // don't wait for it } }
server
function, which uses it li for { select { case req := <-service: - go run(op, req) // don't wait for it + go run(op, req) // don't wait for it case <-quit: return } diff --git a/doc/go_tutorial.txt b/doc/go_tutorial.txt index 17ef6eee930..858958d98d6 100644 --- a/doc/go_tutorial.txt +++ b/doc/go_tutorial.txt @@ -20,9 +20,6 @@ The presentation here proceeds through a series of modest programs to illustrate key features of the language. All the programs work (at time of writing) and are checked into the repository in the directory "/doc/progs/". -Program snippets are annotated with the line number in the original file; for -cleanliness, blank lines remain blank. - Hello, World ---- @@ -136,12 +133,13 @@ a naming conflict. Given "os.Stdout" we can use its "WriteString" method to print the string. -Having imported the "flag" package, line 12 creates a global variable to hold -the value of echo's "-n" flag. The variable "omitNewline" has type "*bool", pointer -to "bool". +After importing the "flag" package, we use a "var" declaration +to create and initialize a global variable, called "omitNewline", +to hold the value of echo's "-n" flag. +The variable has type "*bool", pointer to "bool". -In "main.main", we parse the arguments (line 20) and then create a local -string variable we will use to build the output. +In "main.main", we parse the arguments (the call to "flag.Parse") and then create a local +string variable with which to build the output. The declaration statement has the form @@ -429,7 +427,7 @@ object. We could write return n but for simple structures like "File" it's easier to return the address of a -composite literal, as is done here on line 21. +composite literal, as is done here in the "return" statement from "newFile". We can use the factory to construct some familiar, exported variables of type "*File": @@ -447,9 +445,9 @@ multi-value return as a parenthesized list of declarations; syntactically they look just like a second parameter list. The function "syscall.Open" also has a multi-value return, which we can grab with the multi-variable -declaration on line 31; it declares "r" and "e" to hold the two values, +declaration on the first line; it declares "r" and "e" to hold the two values, both of type "int" (although you'd have to look at the "syscall" package -to see that). Finally, line 35 returns two values: a pointer to the new "File" +to see that). Finally, "OpenFile" returns two values: a pointer to the new "File" and the error. If "syscall.Open" fails, the file descriptor "r" will be negative and "newFile" will return "nil".