summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorSam Zaydel <szaydel@gmail.com>2014-06-29 08:12:58 -0700
committerSam Zaydel <szaydel@gmail.com>2014-06-29 08:12:58 -0700
commit8b6920a70a6f52657bf59a20a4120af98e4187fe (patch)
tree96427e4874c9523384dbd73d4657f3d3600278c2
parente881ba74f302cc5cac7f21cd1e7da163ca774d78 (diff)
Learn function decorators with Go
Added snippet about using closures as function decorators in Go. Also removed a few extra whitespaces.
-rw-r--r--go.html.markdown19
1 files changed, 17 insertions, 2 deletions
diff --git a/go.html.markdown b/go.html.markdown
index c70f96bd..a9a7de72 100644
--- a/go.html.markdown
+++ b/go.html.markdown
@@ -116,10 +116,10 @@ can include line breaks.` // Same string type.
learnFlowControl() // Back in the flow.
}
-// It is possible, unlike in many other languages for functions in go
+// It is possible, unlike in many other languages for functions in go
// to have named return values.
// Assigning a name to the type being returned in the function declaration line
-// allows us to easily return from multiple points in a function as well as to
+// allows us to easily return from multiple points in a function as well as to
// only use the return keyword, without anything further.
func learnNamedReturns(x, y int) (z int) {
z = x * y
@@ -196,6 +196,21 @@ love:
learnInterfaces() // Good stuff coming up!
}
+// Decorators are common in other languages. Same can be done in Go
+// with function literals that accept arguments.
+func learnFunctionFactory(mystring string) func(before, after string) string {
+ return func(before, after string) string {
+ return fmt.Sprintf("%s %s %s", before, mystring, after) // new string
+ }
+}
+
+// Next two are equivalent, with second being more practical
+fmt.Println(learnFunctionFactory("summer")("A beautiful", "day!"))
+
+d := learnFunctionFactory("summer")
+fmt.Println(d("A beautiful", "day!"))
+fmt.Println(d("A lazy", "afternoon!"))
+
func learnDefer() (ok bool) {
// Deferred statements are executed just before the function returns.
defer fmt.Println("deferred statements execute in reverse (LIFO) order.")