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:33] – [STUFF] 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 | + | * earlier: type aliasing |
| * 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 ===== | ||
| - | ==== Basic methods | + | ==== Non-method Abs() function |
| - | Non-method '' | + | Non-method '' |
| < | < | ||
| Line 640: | Line 641: | ||
| } | } | ||
| </ | </ | ||
| + | |||
| + | ==== Basic method ==== | ||
| Go does not support classes; rather, you can define methods on types by adding a //receiver argument// to a function: | Go does not support classes; rather, you can define methods on types by adding a //receiver argument// to a function: | ||
| Line 648: | 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 658: | Line 661: | ||
| } | } | ||
| </ | </ | ||
| + | |||
| + | ==== Methods and type " | ||
| 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 '' | ||
| < | < | ||
| - | type MyFloat float64 | + | type MyFloat float64 |
| func (f MyFloat) Abs() float64 { | func (f MyFloat) Abs() float64 { | ||
| Line 678: | 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 | ||