gpt4 book ai didi

go - 将方法参数传递给函数

转载 作者:行者123 更新时间:2023-12-01 22:41:10 25 4
gpt4 key购买 nike

我很好奇Go中是否有可能。我有多种方法的类型。是否可以有一个函数,该函数接受一个方法参数,然后将其称为类型?

这是我想要的一个小例子:

package main

import (
"fmt"
)

type Foo int

func (f Foo) A() {
fmt.Println("A")
}
func (f Foo) B() {
fmt.Println("B")
}
func (f Foo) C() {
fmt.Println("C")
}

func main() {
var f Foo
bar := func(foo func()) {
f.foo()
}
bar(A)
bar(B)
bar(C)
}

Go认为 Foo类型有一个称为 foo()的方法,而不是用传入的方法名称替换它。

最佳答案

是的,有可能。您有2(3)个选项:

Spec: Method expressions

表达式Foo.A产生与A等效的函数,但第一个参数是显式接收者。它具有签名func(f Foo)

var f Foo
bar := func(m func(f Foo)) {
m(f)
}
bar(Foo.A)
bar(Foo.B)
bar(Foo.C)

在这里,方法接收器是显式的。您只需将方法名称(具有它的类型)传递给 bar(),并且在调用它时,您必须传递实际的接收者: m(f)

按预期输出(在 Go Playground上尝试):
A
B
C

Spec: Method values

如果 fFoo类型的值,则表达式 f.A会产生类型 func()的函数值,该函数值具有隐式接收者值 f
var f Foo
bar := func(m func()) {
m()
}
bar(f.A)
bar(f.B)
bar(f.C)

请注意,这里的方法接收器是隐式的,它与传递给 bar()的函数值一起保存,因此调用它时无需显式指定它: m()

输出是相同的(在 Go Playground上尝试)。

(出于完整性考虑: reflection)

不如以前的解决方案(在性能和“安全性”上都不错),但是您可以将方法的名称作为 string值传递,然后使用 reflect 包以该名称调用该方法。它可能看起来像这样:
var f Foo
bar := func(name string) {
reflect.ValueOf(f).MethodByName(name).Call(nil)
}
bar("A")
bar("B")
bar("C")

Go Playground上尝试一下。

关于go - 将方法参数传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63982911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com