Golang中如何将方法作为参数或回调函数传递
Golang中如何将方法作为参数或回调函数传递 我原以为我理解了如何将方法作为参数传递,但显然我并没有真正理解。我试图让外部函数调用我在接收器上显式声明的方法。以下是我的代码:
package main
type Foo struct {
}
func (f Foo) sum(a, b int) int {
return a + b
}
func main() {
var foo Foo
bar := func(fn func(f Foo)) {
fn(foo)
}
bar(Foo.sum(foo, 2, 2))
}
错误信息:
不能在调用 bar 时使用 Foo.sum(foo, 2, 2)(类型为 int 的值)作为 func(f Foo) 类型的值
我肯定做错了什么,但我就是找不出问题所在。
更多关于Golang中如何将方法作为参数或回调函数传递的实战教程也可以访问 https://www.itying.com/category-94-b0.html
2 回复
我想你可能在找类似这样的东西:Go Playground - The Go Programming Language
你还必须包含参数类型和返回类型(即,Foo.sum 的函数签名是 func(Foo, int, int) int,因此它不能作为 func(Foo) 传递给 bar)。另外,当你将其传递给 bar 时,你正在调用 Foo.sum,所以传递给 bar 的不是 Foo.sum 函数,而是 Foo.sum 的结果,这是一个 int,因此你会得到那个错误。
更多关于Golang中如何将方法作为参数或回调函数传递的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go中,将方法作为参数传递需要理解方法表达式和方法值的区别。你的代码有几个问题:
Foo.sum是方法表达式,它需要接收器作为第一个参数bar期望的是func(f Foo)类型,但你需要传递的是能执行计算的方法
以下是正确的实现方式:
package main
import "fmt"
type Foo struct{}
// 注意:方法名首字母大写,这样它才能被外部包访问
func (f Foo) Sum(a, b int) int {
return a + b
}
func main() {
var foo Foo
// 方法1:使用方法表达式
bar := func(fn func(Foo, int, int) int) {
result := fn(foo, 2, 2)
fmt.Println("结果:", result)
}
// Foo.Sum 是方法表达式,签名是 func(Foo, int, int) int
bar(Foo.Sum)
// 方法2:使用方法值
bar2 := func(fn func(int, int) int) {
result := fn(2, 2)
fmt.Println("结果:", result)
}
// foo.Sum 是方法值,已经绑定了接收器 foo
bar2(foo.Sum)
// 方法3:直接传递函数
bar3 := func(fn func(int, int) int) {
result := fn(2, 2)
fmt.Println("结果:", result)
}
// 如果不需要接收器,可以定义普通函数
sumFunc := func(a, b int) int {
return a + b
}
bar3(sumFunc)
}
如果你想让外部函数调用接收器上的方法,可以这样:
package main
import "fmt"
type Foo struct {
value int
}
func (f Foo) Sum(a, b int) int {
return f.value + a + b
}
// 接受一个方法作为参数
func CallMethod(fn func(Foo, int, int) int, foo Foo, a, b int) int {
return fn(foo, a, b)
}
func main() {
foo := Foo{value: 10}
// 使用方法表达式
result := CallMethod(Foo.Sum, foo, 2, 2)
fmt.Println("结果:", result) // 输出: 14
// 或者使用方法值
methodValue := foo.Sum
fmt.Println("方法值调用:", methodValue(2, 2)) // 输出: 14
}
关键点:
Foo.Sum是方法表达式,类型为func(Foo, int, int) intfoo.Sum是方法值,类型为func(int, int) int(接收器已绑定)- 方法表达式将接收器作为第一个显式参数
- 方法值已经隐含了接收器,调用时不需要再传递接收器

