函数可以在Go中作为parameter passing吗?
在Java中,我可以做一些像derp(new Runnable { public void run () { /* run this sometime later */ } })
然后在方法中运行代码。 处理(匿名内部类)是一件痛苦的事,但是可以做到。
Go有什么可以促进作为参数传入的函数/callback吗?
是的,考虑一下这些例子:
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 "" }) }
播放: http : //play.golang.org/p/XNMtrDUDS0
游览: https : //tour.golang.org/moretypes/25 (function闭包)
您可以将函数作为parameter passing给Go函数。 下面是将函数作为parameter passing给另一个Go函数的示例:
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) }
你可以试试这个: https : //play.golang.org/p/9mAOUWGp0k
这是一个简单的例子:
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)) }
这里是Go中的示例“Map”实现。 希望这可以帮助!!
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) }
是Go接受一stream的function。
请参阅文章“Go中的头等function”以获取有用的链接。