英文:
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 <- true;
}();
return done;
}
and call it:
max := func(a, b int) int {
//some hard code what will be goroutine
if a > b {return a};
return b;
}
done := AsyncFunc(max, 5, 8);
//some pretty code
<- 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 (
"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)
}
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语言的代码示例。它定义了两个函数t1
和t2
,分别接受一个整数和一个字符串作为参数,并在控制台打印出相应的值。test
函数接受一个函数和一个数据作为参数,并根据函数的类型调用相应的函数。在main
函数中,我们使用test
函数来测试t1
和t2
函数。
英文:
i found the way to do what i want.
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");
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论