Golang : Function as an argument type example
When we need to invoke another function inside a.... let's say outer function, the typical way to do this is to call the desire function inside the outer function. For example, fmt.Sprintf()
:
func int2str(i int) string {
str := fmt.Sprintf("%d", i)
}
In Golang, we are allowed to pass a function as an argument of another function. This can be illustrated by comparing the differences between these two simple programs.
Program 1:
package main
import (
"fmt"
"strconv"
)
func OuterFunc(a int, b int) string {
c := a + b
return strconv.Itoa(c)
}
func main() {
result := OuterFunc(1, 2)
fmt.Println(result)
}
versus
Program 2:
package main
import (
"fmt"
"strconv"
)
var a string = "1"
func OuterFunc(strToInt func(s string) int, b int) string {
c := strToInt(a) + b
return strconv.Itoa(c)
}
func main() {
strToInt := func(s string) int {
num, _ := strconv.Atoi(s)
return num
}
result := OuterFunc(strToInt, 2)
fmt.Println(result)
}
Both programs will produce the same output.
This is also known as anonymous function and you can read a better example at https://gobyexample.com/closures
Now, why use a function as an argument of another function?
The motivation behind this ability is to allow you to specify and pass logic(algorithm) to another function. This is a powerful feature to have in programming language. One clear example that I can think of is how bytes.Map()
function uses this feature to handle the mapping function.
Code from https://www.socketloop.com/references/golang-bytes-map-function-example
package main
import (
"bytes"
"fmt"
)
func main() {
str := []byte("abcxefg")
mapping := func(replacekey rune) rune {
if replacekey == 'x' {
return 'd'
}
return replacekey
}
fmt.Println(string(str))
// now replace x with d
fmt.Println(string(bytes.Map(mapping, str)))
}
Output:
abcxefg
abcdefg
To see the inner working of how bytes.Map()
function works, check out https://golang.org/src/bytes/bytes.go?s=8894:8946#L347
To know more about how Golang treat functions, please read this article - "First Class Functions in Go" by Andrew Gerrand.
Happy coding!
References:
https://golang.org/pkg/bytes/#Map
https://www.socketloop.com/references/golang-bytes-map-function-example
By Adam Ng
IF you gain some knowledge or the information here solved your programming problem. Please consider donating to the less fortunate or some charities that you like. Apart from donation, planting trees, volunteering or reducing your carbon footprint will be great too.
Advertisement
Tutorials
+8.8k Golang : Compare files modify date example
+10.3k Golang : Concurrency and goroutine example
+10.2k Golang : How to flush a channel before the end of program?
+18.8k Golang : Count number of digits from given integer value
+6.3k Golang : Hue, Saturation and Value(HSV) with OpenCV example
+15.3k Golang : File path independent of Operating System
+5.4k Golang : Find the longest line of text example
+15k Golang :Trim white spaces from a string
+9k Fix ERROR 1045 (28000): Access denied for user 'root'@'ip-address' (using password: YES)
+6.3k Golang : Check to see if *File is a file or directory
+5.1k Golang : Detect face in uploaded photo like GPlus
+5.9k Golang : Levenshtein distance example