Golang将函数作为参数传递给另一个函数。

huangapple go评论75阅读模式
英文:

golang passing func as param to another func

问题

主要问题是“是否可能将任何类型的函数作为参数传递,如何传递?”。
我正在学习Go语言,想要创建自己的异步包装函数,就像这样:

func AsyncFunc(fn func(), args ...interface{}) chan bool {
    var done chan bool;

    go func() {
        fn(args...);
        done <- true;
    }();

    return done;
}

然后调用它:

max := func(a, b int) int {
    //一些将作为goroutine运行的代码
    if a > b {return a};
    return b;
}

done := AsyncFunc(max, 5, 8);
//一些漂亮的代码
<- done;

附注:如果我的英语不好,对不起...

编辑1:
我知道这是无用的、慢速的和危险的。这只是我想要实现的一个疯狂的想法。

英文:

Main question is "is it possible to pass any type func as param and how?".
I am learning Go and want to make my own async wrap function like this:

func AsyncFunc(fn func(), args ...interface{}) chan bool {
    var done chan bool;

    go func() {
        fn(args...);
        done &lt;- true;
    }();

    return done;
}

and call it:

max := func(a, b int) int {
    //some hard code what will be goroutine
    if a &gt; b {return a};
    return b;
}

done := AsyncFunc(max, 5, 8);
//some pretty code
&lt;- done;

P.S. sorry for my English if it is bad...

Edit1:
I know it is useless, slow and danger. It is just my crazy idea what i want just realise.

答案1

得分: 6

当然,Go语言可以做到。请考虑以下简单的示例:

package main

import (
    "fmt"
)

type funcDef func(string) string

func foo(s string) string {
    return fmt.Sprintf("from foo: %s", s)
}

func test(someFunc funcDef, s string) string {
    return someFunc(s)
}

func main() {
    output := test(foo, "some string")
    fmt.Println(output)
}

对于你的具体情况,你只需要:

type funcDef func(int, int) int

func AsyncFunc(f funcDef, a, b int) chan bool {
    // 实现异步函数的逻辑
    // ...
}

done := AsyncFunc(max, 5, 8)

希望对你有帮助!

英文:

Of course Go can do it. Please consider the following simple example:

package main

import (
        &quot;fmt&quot;
)

type funcDef func(string) string

func foo(s string) string {
        return fmt.Sprintf(&quot;from foo: %s&quot;, s)
}

func test(someFunc funcDef, s string) string {
        return someFunc(s)
}

func main() {
        output := test(foo, &quot;some string&quot;)
        fmt.Println(output)
}

And to be specific in your case, you just need to:

type funcDef func(int, int) int

func AsyncFunc(func funcDef, a, b int) chan bool {
    ....
}

done := AsyncFunc(max, 5, 8)

答案2

得分: 2

我找到了实现我想要的功能的方法。

package main


import (
    "fmt"
)


func t1(t int) {
    fmt.Printf("%d\n", t);
}


func t2(t string) {
    fmt.Printf("%s\n", t);
}


func test(fn interface{}, data interface{}) {
    switch fn.(type) {
    case func(string):
        fn.(func(string))(data.(string))
    case func(int):
        fn.(func(int))(data.(int))
    }
}


func main() {
    test(t1, 123);
    test(t2, "test");
}

请注意,这是一个Go语言的代码示例。它定义了两个函数t1t2,分别接受一个整数和一个字符串作为参数,并在控制台打印出相应的值。test函数接受一个函数和一个数据作为参数,并根据函数的类型调用相应的函数。在main函数中,我们使用test函数来测试t1t2函数。

英文:

i found the way to do what i want.

 package main
 
 
 import (
     &quot;fmt&quot;
 )
 
 
 func t1(t int) {
     fmt.Printf(&quot;%d\n&quot;, t);
 }
 
 
 func t2(t string) {
     fmt.Printf(&quot;%s\n&quot;, t);
 }
 
 
 func test(fn interface{}, data interface{}) {
     switch fn.(type) {
     case func(string):
         fn.(func(string))(data.(string))
     case func(int):
         fn.(func(int))(data.(int))
     }
 }
 
 
 func main() {
     test(t1, 123);
     test(t2, &quot;test&quot;);
 }

huangapple
  • 本文由 发表于 2017年6月16日 05:21:55
  • 转载请务必保留本文链接:https://go.coder-hub.com/44577234.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定