1
0
mirror of https://github.com/adambard/learnxinyminutes-docs.git synced 2025-08-13 10:14:58 +02:00

Merge pull request #660 from szaydel/master

Learn function decorators with Go
This commit is contained in:
Levi Bostian
2014-06-29 17:29:18 -05:00

View File

@@ -116,10 +116,10 @@ can include line breaks.` // Same string type.
learnFlowControl() // Back in the flow. 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. // to have named return values.
// Assigning a name to the type being returned in the function declaration line // 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. // only use the return keyword, without anything further.
func learnNamedReturns(x, y int) (z int) { func learnNamedReturns(x, y int) (z int) {
z = x * y z = x * y
@@ -196,6 +196,21 @@ love:
learnInterfaces() // Good stuff coming up! 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) { func learnDefer() (ok bool) {
// Deferred statements are executed just before the function returns. // Deferred statements are executed just before the function returns.
defer fmt.Println("deferred statements execute in reverse (LIFO) order.") defer fmt.Println("deferred statements execute in reverse (LIFO) order.")