Last time, we learned how to
pass arguments to functions in Go. We even managed to pass a function as an argument illustrating
Go's First-Class Functions.
We ended up with a small piece of code as follows:
package main
import "fmt"
func goodbye(aFunc func(words string) string) {
fmt.Println(aFunc("Goodbye"))
}
func hello(aFunc func(words string) string) {
fmt.Println(aFunc("Hello"))
}
func main() {
var x = func(words string) string {
return words + " world"
}
hello(x)
goodbye(x)
}
We have two functions that take as an argument, another function. You will notice that both
func goodbye and
func hello have the same signature for their single argument. This kind of duplication is crying out for a refactor, and that's exactly what we are going to do.
Instead of declaring the function signature as an argument (
aFunc func(words string) string), we are going to create a type with that function signature. To
declare a type in Go, we simply use the
type keyword. Our function that will be used as an argument can be declared like this:
type myOwnFunction func(words string) string
We can then use our newly defined type. For example, our
goodbye function can be re-written to use our new type:
func goodbye(aFunc myOwnFunction) {
fmt.Println(aFunc ("Goodbye"))
}
Similarly, our
hello function:
func hello(aFunc myOwnFunction) {
fmt.Println(aFunc ("Hello"))
}
The rest of our code can remain untouched. A complete listing of our refactored code now looks like this:
package main
import "fmt"
type myOwnFunction func(words string) string
func goodbye(aFunc myOwnFunction) {
fmt.Println(aFunc ("Goodbye"))
}
func hello(aFunc myOwnFunction) {
fmt.Println(aFunc ("Hello"))
}
func main() {
var x = func(words string) string {
return words + " world"
}
hello(x)
goodbye(x)
}
No comments:
Post a Comment