diff options
author | Sam Zaydel <szaydel@gmail.com> | 2014-06-29 08:12:58 -0700 |
---|---|---|
committer | Sam Zaydel <szaydel@gmail.com> | 2014-06-29 08:12:58 -0700 |
commit | 8b6920a70a6f52657bf59a20a4120af98e4187fe (patch) | |
tree | 96427e4874c9523384dbd73d4657f3d3600278c2 /go.html.markdown | |
parent | e881ba74f302cc5cac7f21cd1e7da163ca774d78 (diff) |
Learn function decorators with Go
Added snippet about using closures as function decorators in Go. Also
removed a few extra whitespaces.
Diffstat (limited to 'go.html.markdown')
-rw-r--r-- | go.html.markdown | 19 |
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.") |