go-tour: add discussion of pointers and some small tweaks
- Mention Sprint instead of Print when discussing recursive stringers.
- Remove discussion of the "new" function; it's rarely used today.
- Better hint in the cube root exercise (Who knows the cube root of 2?).
- Use v to refer to Vertex and p to refer to a pointer.
LGTM=campoy
R=campoy
CC=golang-codereviews
https://golang.org/cl/117840043
diff --git a/content/methods.article b/content/methods.article
index dd81829..bf9339f 100644
--- a/content/methods.article
+++ b/content/methods.article
@@ -91,7 +91,7 @@
method such that `ErrNegativeSqrt(-2).Error()` returns `"cannot`Sqrt`negative`number:`-2"`.
-*Note:* a call to `fmt.Print(e)` inside the `Error` method will send the program into an infinite loop. You can avoid this by converting `e` first: `fmt.Print(float64(e))`. Why?
+*Note:* a call to `fmt.Sprint(e)` inside the `Error` method will send the program into an infinite loop. You can avoid this by converting `e` first: `fmt.Sprint(float64(e))`. Why?
Change your `Sqrt` function to return an `ErrNegativeSqrt` value when given a negative number.
@@ -184,4 +184,4 @@
You finished this lesson!
-You can go back to the list of [[/list][modules]] to find what to learn next, or continue with the [[javascript:click('.next-page')][next lesson]].
\ No newline at end of file
+You can go back to the list of [[/list][modules]] to find what to learn next, or continue with the [[javascript:click('.next-page')][next lesson]].
diff --git a/content/moretypes.article b/content/moretypes.article
index 7d717f5..28e9298 100644
--- a/content/moretypes.article
+++ b/content/moretypes.article
@@ -4,6 +4,31 @@
The Go Authors
http://golang.org
+* Pointers
+
+Go has pointers.
+A pointer holds the memory address of a variable.
+
+The type `*T` is a pointer to a `T` value. Its zero value is `nil`.
+
+ var p *int
+
+The `&` operator generates a pointer to its operand.
+
+ i := 42
+ p = &i
+
+The `*` operator denotes the pointer's underlying value.
+
+ fmt.Println(*p) // read i through the pointer p
+ *p = 21 // set i through the pointer p
+
+This is known as "dereferencing" or "indirecting".
+
+Unlike C, Go has no pointer arithmetic.
+
+.play prog/tour/pointers.go
+
* Structs
A `struct` is a collection of fields.
@@ -18,13 +43,13 @@
.play prog/tour/struct-fields.go
-* Pointers
+* Pointers to structs
-Go has pointers, but no pointer arithmetic.
+Struct fields can be accessed through a struct pointer.
-Struct fields can be accessed through a struct pointer. The indirection through the pointer is transparent.
+The indirection through the pointer is transparent.
-.play prog/tour/pointers.go
+.play prog/tour/struct-pointers.go
* Struct Literals
@@ -32,22 +57,10 @@
You can list just a subset of fields by using the `Name:` syntax. (And the order of named fields is irrelevant.)
-The special prefix `&` constructs a pointer to a newly allocated struct.
+The special prefix `&` returns a pointer to the struct value.
.play prog/tour/struct-literals.go
-* The new function
-
-The expression `new(T)` allocates a zeroed `T` value and returns a pointer to it.
-
- var t *T = new(T)
-
-or
-
- t := new(T)
-
-.play prog/tour/the-new-function.go
-
* Arrays
The type `[n]T` is an array of `n` values of type `T`.
@@ -135,7 +148,7 @@
Implement `Pic`. It should return a slice of length `dy`, each element of which is a slice of `dx` 8-bit unsigned integers. When you run the program, it will display your picture, interpreting the integers as grayscale (well, bluescale) values.
-The choice of image is up to you. Interesting functions include `x^y`, `(x+y)/2`, and `x*y`.
+The choice of image is up to you. Interesting functions include `(x+y)/2`, `x*y`, and `x^y` (to compute the latter function, use [[http://golang.org/pkg/math/#Pow][`math.Pow`]]).
(You need to use a loop to allocate each `[]uint8` inside the `[][]uint8`.)
@@ -224,7 +237,7 @@
.image /content/img/newton3.png
-Find the cube root of 2, just to make sure the algorithm works. There is a [[http://golang.org/pkg/math/cmplx/#Pow][Pow]] function in the `math/cmplx` package.
+Find the cube root of 8, just to make sure the algorithm works. (There is a [[http://golang.org/pkg/math/cmplx/#Pow][Pow]] function in the `math/cmplx` package to check your results.)
.play prog/tour/advanced-exercise-complex-cube-roots.go
@@ -232,4 +245,4 @@
You finished this lesson!
-You can go back to the list of [[/list][modules]] to find what to learn next, or continue with the [[javascript:click('.next-page')][next lesson]].
\ No newline at end of file
+You can go back to the list of [[/list][modules]] to find what to learn next, or continue with the [[javascript:click('.next-page')][next lesson]].
diff --git a/content/prog/tour/exercise-errors.go b/content/prog/tour/exercise-errors.go
index b8554e4..22e933b 100644
--- a/content/prog/tour/exercise-errors.go
+++ b/content/prog/tour/exercise-errors.go
@@ -6,7 +6,7 @@
"fmt"
)
-func Sqrt(f float64) (float64, error) {
+func Sqrt(x float64) (float64, error) {
return 0, nil
}
diff --git a/content/prog/tour/pointers.go b/content/prog/tour/pointers.go
index daf0464..9909b3c 100644
--- a/content/prog/tour/pointers.go
+++ b/content/prog/tour/pointers.go
@@ -4,14 +4,15 @@
import "fmt"
-type Vertex struct {
- X int
- Y int
-}
-
func main() {
- p := Vertex{1, 2}
- q := &p
- q.X = 1e9
- fmt.Println(p)
+ i, j := 42, 2701
+
+ p := &i // point to i
+ fmt.Println(*p) // read i through the pointer
+ *p = 21 // set i through the pointer
+ fmt.Println(i) // see the new value of i
+
+ p = &j // point to j
+ *p = *p / 37 // divide j through the pointer
+ fmt.Println(j) // see the new value of j
}
diff --git a/content/prog/tour/struct-literals.go b/content/prog/tour/struct-literals.go
index 20d3a90..5a96b2c 100644
--- a/content/prog/tour/struct-literals.go
+++ b/content/prog/tour/struct-literals.go
@@ -9,12 +9,12 @@
}
var (
- p = Vertex{1, 2} // has type Vertex
- q = &Vertex{1, 2} // has type *Vertex
- r = Vertex{X: 1} // Y:0 is implicit
- s = Vertex{} // X:0 and Y:0
+ v1 = Vertex{1, 2} // has type Vertex
+ v2 = Vertex{X: 1} // Y:0 is implicit
+ v3 = Vertex{} // X:0 and Y:0
+ p = &Vertex{1, 2} // has type *Vertex
)
func main() {
- fmt.Println(p, q, r, s)
+ fmt.Println(v1, p, v2, v3)
}
diff --git a/content/prog/tour/the-new-function.go b/content/prog/tour/struct-pointers.go
similarity index 61%
rename from content/prog/tour/the-new-function.go
rename to content/prog/tour/struct-pointers.go
index cc4db9f..901f003 100644
--- a/content/prog/tour/the-new-function.go
+++ b/content/prog/tour/struct-pointers.go
@@ -5,12 +5,13 @@
import "fmt"
type Vertex struct {
- X, Y int
+ X int
+ Y int
}
func main() {
- v := new(Vertex)
- fmt.Println(v)
- v.X, v.Y = 11, 9
+ v := Vertex{1, 2}
+ p := &v
+ p.X = 1e9
fmt.Println(v)
}