From c17347eea971701057a30ef97ff2ef72f684760f Mon Sep 17 00:00:00 2001 From: Rob Pike Date: Sat, 9 Jul 2011 23:17:38 +1000 Subject: [PATCH] tutorial: remove all line numbers and references to them. R=golang-dev, mikioh.mikioh, dsymonds CC=golang-dev https://golang.org/cl/4675070 --- doc/go_tutorial.html | 82 ++++++++++++++++++++++---------------------- doc/go_tutorial.txt | 20 +++++------ 2 files changed, 50 insertions(+), 52 deletions(-) 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. -

Hello, World

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 utility echo(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 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

@@ -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 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:

@@ -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 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.

@@ -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 inttype 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 @@ of generate, from progs/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 filter:
     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 } }

@@ -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 the 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".