diff --git a/213-Method-Values-and-Expressions/method-values-1.gop b/213-Method-Values-and-Expressions/method-values-1.gop new file mode 100644 index 0000000..29be2c5 --- /dev/null +++ b/213-Method-Values-and-Expressions/method-values-1.gop @@ -0,0 +1,19 @@ + +# Method value + +// Method values allow you to bind a method to a specific object, and then call the method as an ordinary function with the object implied, in a kind of closure. For example: + +type Hello struct { +} + +func (hello *Hello) Say() { + println "Hello" +} + +hello := &Hello{} + +hello.Say + +printf("%T", hello.Say) + +// The expression hello.Say creates a method value, binding the Say function to the specific variable hello, giving it a type of func(). So function values can be passed as function parameters \ No newline at end of file diff --git a/213-Method-Values-and-Expressions/method-values-2.gop b/213-Method-Values-and-Expressions/method-values-2.gop new file mode 100644 index 0000000..6d1ca79 --- /dev/null +++ b/213-Method-Values-and-Expressions/method-values-2.gop @@ -0,0 +1,25 @@ + +# Method expressions + +// Method expressions let you transform a method into a function with the receiver as its first argument. For example: + +type Point struct { + x float64 + y float64 +} + +func (p Point) Add(another Point) Point { + return Point{p.x+another.x, p.y+another.y} +} + +func (p Point) String() string { + return sprintf("x: %.1f, y: %.1f", p.x, p.y) +} + +p := Point{20, 10} +another := Point{30, 40} + +println p.Add(another) +println Point.Add(p, another) + +// So if you defined a Point struct and a method func (p Point) Add(another Point), you could write Point.Add to get a func(p Point, another Point). diff --git a/213-Method-Values-and-Expressions/method-values-3.gop b/213-Method-Values-and-Expressions/method-values-3.gop new file mode 100644 index 0000000..44eb992 --- /dev/null +++ b/213-Method-Values-and-Expressions/method-values-3.gop @@ -0,0 +1,24 @@ + +// But if the method has a pointer receiver, you need to write (*Type).Method in your method expression. For example: + +type Point struct { + x float64 + y float64 +} + +func (p *Point)Add(another Point) { + p.x += another.x + p.y += another.y +} + +func (p *Point) String() string { + return sprintf("x: %.1f, y: %.1f", p.x, p.y) +} + +p := &Point{20, 10} +another := Point{30, 40} + +p.Add(another) +(*Point).Add(p, another) + +println p \ No newline at end of file diff --git a/213-Method-Values-and-Expressions/method-values.gop b/213-Method-Values-and-Expressions/method-values.gop deleted file mode 100644 index 8b13789..0000000 --- a/213-Method-Values-and-Expressions/method-values.gop +++ /dev/null @@ -1 +0,0 @@ -