当前位置: 首页 > 面试题库 >

将方法参数传递给函数

安明亮
2023-03-14
问题内容

我很好奇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认为type Foo有一个称为的方法foo(),而不是用传入的方法名称替换它。


问题答案:

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

规范:方法表达式

该表达式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

规格:方法值

如果f是type的值Foo,则表达式会f.A产生func()具有隐式接收者值的type的函数值f

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

请注意,这里的方法接收器是隐含的,它被保存与传递给函数的值bar(),所以它被称为没有明确指定它:m()

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

(出于完整性考虑:反射)

不如以前的解决方案(在性能和“安全性”上都不错),但是您可以将方法的名称作为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在创建带有参数的匿名函数与将该函数用作闭包之间的区别。这是区别的一个例子。 带参数: 作为关闭: 我的问题是,第一种形式何时比第二种更好?您是否会为此类事情使用参数?我唯一看到第一种形式有用的是从另一个函数返回a时。 问题答案: 使用闭包与使用函数参数之间的区别在于共享同一变量与获取值的副本有关。请考虑下面的两个示例。 在 Closure中, 所有函数调用都将使用中存储的

  • 问题内容: 我已经熟悉Android框架和Java,并希望创建一个通用的“ NetworkHelper”类,该类可以处理大多数联网代码,使我能够从中调用网页。 我遵循了来自developer.android.com的这篇文章来创建我的网络类:http : //developer.android.com/training/basics/network- ops/connecting.html 码:

  • 问题内容: 我正在尝试将一些参数传递给用作回调的函数,该怎么做? 问题答案: 如果您想要更一般的东西,可以使用arguments变量,如下所示: 但是否则,您的示例可以正常工作(可以在测试器中使用arguments [0]代替回调)

  • 问题内容: 这似乎是一个愚蠢的问题,但是我是这个话题的新手。我正在致力于关于节点js的承诺。我想将参数传递给Promise函数。但是我不知道。 而功能类似于 问题答案: 将Promise包裹在一个函数中,否则它将立即开始工作。另外,您可以将参数传递给函数: 然后,使用它: ES6: 用:

  • 问题内容: 基本上我有一个ArrayList的位置: 在此之下,我调用以下方法: getMap()方法中的参数为: 我遇到的问题是我不确定如何在整个方法列表中传递该方法。 我试过了 但是getMap不接受,因为它不接受Objects []。 现在,如果我使用 它会完美地工作…但是我需要以某种方式传递所有位置…我当然可以继续添加等等,但是数组的大小会有所不同。我只是不习惯整个概念 最简单的方法是什么

  • 我正在使用Camel 2.13.1我想将一个类作为参数传递给bean中的一个方法 我能做些像 我知道我可以在header中发送限定类名,并在bean中使用它,但感觉不太对。还有其他选择吗? 我看到了这个链接,但它不适合我Apache Camel-Spring DSL-将字符串参数传递给bean方法