220

Javaでは次のようなことができます

derp(new Runnable { public void run () { /* run this sometime later */ } })

後でメソッドのコードを「実行」します。(匿名の内部クラス)を処理するのは面倒ですが、実行することはできます。

Goには、関数/コールバックをパラメーターとして渡すのを容易にするものがありますか?

4

8 に答える 8

295

はい、これらの例のいくつかを検討してください。

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 (関数の閉鎖)

于 2012-09-29T19:18:35.287 に答える
52

関数をパラメーターとして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)
}

https://play.golang.org/p/9mAOUWGp0kでこれを試すことができます

于 2016-02-24T19:22:21.150 に答える
21

これは、Goでの「マップ」実装のサンプルです。お役に立てれば!!

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)

}
于 2017-03-11T18:43:08.633 に答える
9

簡単な例を次に示します。

    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))
    }
于 2012-10-05T01:04:46.613 に答える
3

これは私が来ることができる最も簡単な方法です。

package main

import "fmt"

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

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

func greeting() {
    fmt.Println("Hello")
}
于 2021-02-06T04:52:54.623 に答える
2

以下の例がより明確になることを願っています。

package main

type EmployeeManager struct{
    category            string
    city                string
    calculateSalary     func() int64
}


func NewEmployeeManager() (*EmployeeManager,error){

    return &EmployeeManager{
        category : "MANAGEMENT",
        city : "NY",
        calculateSalary: func() int64 {
            var calculatedSalary int64
            // some formula
            return calculatedSalary
        },
    },nil
}

func (self *EmployeeManager) emWithSalaryCalculation(){
    self.calculateSalary = func() int64 {
        var calculatedSalary int64
        // some new formula
        return calculatedSalary
    }
}

func updateEmployeeInfo(em EmployeeManager){
    // Some code
}

func processEmployee(){
    updateEmployeeInfo(struct {
        category        string
        city            string
        calculateSalary func() int64
    }{category: "", city: "", calculateSalary: func() int64 {
        var calculatedSalary int64
        // some new formula
        return calculatedSalary
    }})
}
于 2019-01-05T20:19:09.093 に答える
0

次のような構造体の関数を渡すこともできます。

    package main
    // define struct
    type Apple struct {}
    
    // return apple's color
    func (Apple) GetColor() string {
         return "Red" 
    }
    
    func main () {
        // instantiate
        myApple := Apple{}
        
        // put the func in a variable
        theFunc := myApple.GetColor
        
        // execute the variable as a function
        color := theFunc()
    
        print(color)
    }

出力は「赤」になります、遊び場で確認してください

于 2020-12-25T18:19:09.037 に答える
-2

はいGoはファーストクラス関数を受け入れます。

便利なリンクについては、 「Goのファーストクラス関数」の記事を参照してください。

于 2012-09-29T18:53:23.897 に答える