Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| go_tour_notes [2018/04/13 08:40] – [STUFF (tour)] rpjday | go_tour_notes [2018/04/14 08:57] (current) – [Refresher: pointer-based function] rpjday | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ===== STUFF (tour) ===== | ===== STUFF (tour) ===== | ||
| - | * explain early that functions are not polymorphic | + | * explain early that functions are not polymorphic |
| * earlier: type aliasing (which introduces a new type, not just an alias, except for byte and rune) | * earlier: type aliasing (which introduces a new type, not just an alias, except for byte and rune) | ||
| * swap first two pages of Methods section | * swap first two pages of Methods section | ||
| + | * I would move closures later (possibly after methods) | ||
| ===== Welcome ===== | ===== Welcome ===== | ||
| Line 622: | Line 623: | ||
| ===== Methods ===== | ===== Methods ===== | ||
| - | ==== Non-method Abs() ==== | + | ==== Non-method Abs() function |
| Non-method '' | Non-method '' | ||
| Line 650: | Line 651: | ||
| } | } | ||
| - | func (v Vertex) Abs() float64 { | + | func (v Vertex) Abs() float64 { // receiver argument |
| return math.Sqrt(v.X*v.X + v.Y*v.Y) | return math.Sqrt(v.X*v.X + v.Y*v.Y) | ||
| } | } | ||
| Line 661: | Line 662: | ||
| </ | </ | ||
| - | ==== Methods and type aliasing ==== | + | ==== Methods and type "aliasing" |
| You can declare a method on non-struct types, too. Below, we see a numeric type '' | You can declare a method on non-struct types, too. Below, we see a numeric type '' | ||
| Line 682: | Line 683: | ||
| You can only declare a method with a receiver whose type is defined in the same package as the method. You //cannot// declare a method with a receiver whose type is defined in another package (which includes the built-in types such as '' | You can only declare a method with a receiver whose type is defined in the same package as the method. You //cannot// declare a method with a receiver whose type is defined in another package (which includes the built-in types such as '' | ||
| + | |||
| + | ===== Methods with pointer receivers ===== | ||
| + | |||
| + | ==== Refresher: call-by-value ==== | ||
| + | |||
| + | Call-by-value function, which makes a //copy// of the argument: | ||
| + | |||
| + | < | ||
| + | package main | ||
| + | |||
| + | import ( | ||
| + | " | ||
| + | ) | ||
| + | |||
| + | type Vertex struct { | ||
| + | X, Y float64 | ||
| + | } | ||
| + | |||
| + | func Scale(v Vertex, f float64) Vertex { | ||
| + | v.X = v.X * f | ||
| + | v.Y = v.Y * f | ||
| + | return v | ||
| + | } | ||
| + | |||
| + | func main() { | ||
| + | v := Vertex{3, 4} | ||
| + | fmt.Println(v) | ||
| + | fmt.Println(Scale(v, | ||
| + | fmt.Println(v) | ||
| + | } | ||
| + | |||
| + | {3 4} | ||
| + | {30 40} | ||
| + | {3 4} | ||
| + | </ | ||
| + | |||
| + | ==== Refresher: pointer-based function ==== | ||
| + | |||
| + | Pointer-based call: | ||
| + | |||
| + | < | ||
| + | package main | ||
| + | |||
| + | import ( | ||
| + | " | ||
| + | ) | ||
| + | |||
| + | type Vertex struct { | ||
| + | X, Y float64 | ||
| + | } | ||
| + | |||
| + | func Scale(v *Vertex, f float64) { | ||
| + | v.X = v.X * f | ||
| + | v.Y = v.Y * f | ||
| + | } | ||
| + | |||
| + | func main() { | ||
| + | v := Vertex{3, 4} | ||
| + | fmt.Println(v) | ||
| + | Scale(& | ||
| + | fmt.Println(v) | ||
| + | } | ||
| + | |||
| + | {3 4} | ||
| + | {30 40} | ||
| + | </ | ||
| + | |||
| + | Notes about the above: | ||
| + | |||
| + | * Even if the arg is a pointer, Go allows you to use " | ||
| + | * You cannot support both variations of that function | ||