Can functions be passed as parameters in Go?

In Java, I can do something like derp(new Runnable { public void run () { /* run this sometime later */ } }) and "run" the code in the method later. This is a pain to handle (anonymous inner class), but it can be done.

Does Go have something that can facilitate passing a function / callback as a parameter?

+129
function go
Sep 29 '12 at 18:45
source share
5 answers

Yes, consider some of these examples:

 package main import "fmt" // convert types take an int and return a string value. type convert func(int) string // value implements convert, returning x as string. func value(x int) string { return fmt.Sprintf("%v", x) } // quote123 passes 123 to convert func and returns quoted string. func quote123(fn convert) string { return fmt.Sprintf("%q", fn(123)) } func main() { var result string result = value(123) fmt.Println(result) // Output: 123 result = quote123(value) fmt.Println(result) // Output: "123" result = quote123(func(x int) string { return fmt.Sprintf("%b", x) }) fmt.Println(result) // Output: "1111011" foo := func(x int) string { return "foo" } result = quote123(foo) fmt.Println(result) // Output: "foo" _ = convert(foo) // confirm foo satisfies convert at runtime // fails due to argument type // _ = convert(func(x float64) string { return "" }) } 

Play: http://play.golang.org/p/XNMtrDUDS0

Tour: https://tour.golang.org/moretypes/25 (Function Closure)

+191
Sep 29 '12 at 19:18
source share

You can pass the function as a parameter to the Go function. The following is an example of passing a function as a parameter to another Go function:

 package main import "fmt" type fn func(int) func myfn1(i int) { fmt.Printf("\ni is %v", i) } func myfn2(i int) { fmt.Printf("\ni is %v", i) } func test(f fn, val int) { f(val) } func main() { test(myfn1, 123) test(myfn2, 321) } 

You can try this: https://play.golang.org/p/9mAOUWGp0k

+28
Feb 24 '16 at 19:22
source share

Here is an example implementation of Map in Go. Hope this helps!

 func square(num int) int { return num * num } func mapper(f func(int) int, alist []int) []int { var a = make([]int, len(alist), len(alist)) for index, val := range alist { a[index] = f(val) } return a } func main() { alist := []int{4, 5, 6, 7} result := mapper(square, alist) fmt.Println(result) } 
+8
Mar 11 '17 at 18:43
source share

Here is a simple example:

  package main import "fmt" func plusTwo() (func(v int) (int)) { return func(v int) (int) { return v+2 } } func plusX(x int) (func(v int) (int)) { return func(v int) (int) { return v+x } } func main() { p := plusTwo() fmt.Printf("3+2: %d\n", p(3)) px := plusX(3) fmt.Printf("3+3: %d\n", px(3)) } 
+6
Oct 05
source share

Yes Go takes first-class features.

See the article "First Class Functions in Go" for useful links.

-one
Sep 29 '12 at 18:53
source share



All Articles