函数可以作为Go中的参数传递吗?

Saa*_*aad 130 function go

在Java中,我可以做类似的事情__CODE__并在以后"运行"该方法中的代码.处理(匿名内部类)是一种痛苦,但它可以做到.

Go是否有一些可以促进函数/回调作为参数传入的东西?

dsk*_*ner 192

是的,请考虑以下一些示例:

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 "" })
}
Run Code Online (Sandbox Code Playgroud)

播放:http://play.golang.org/p/XNMtrDUDS0

游览:https://tour.golang.org/moretypes/25(功能闭包)


Gau*_*nha 29

您可以将函数作为参数传递给Go函数.以下是将函数作为参数传递给另一个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)
}
Run Code Online (Sandbox Code Playgroud)

你可以试试这个:https://play.golang.org/p/9mAOUWGp0k

  • 谢谢!这是如何最好地利用这个想法的一个非常清晰的例子!我使用存储信息的结构查找表重新创建了它,包括指向您希望执行的函数的指针。非常适合这个! (2认同)

小智 10

以下是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)

}
Run Code Online (Sandbox Code Playgroud)


小智 8

这是我能想到的最简单的方法。

package main

import "fmt"

func main() {
    g := greeting
    getFunc(g)
}

func getFunc(f func()) {
    f()
}

func greeting() {
    fmt.Println("Hello")
}
Run Code Online (Sandbox Code Playgroud)


小智 7

这是一个简单的例子:

    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))
    }
Run Code Online (Sandbox Code Playgroud)

  • 那是返回一个没有传递函数的函数 (4认同)