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

在golang中调用作为接口变量接收的函数

巫马翰翮
2023-03-14
问题内容

我有一个类似于以下的代码

package main

import "fmt"

func PrintThis(arg string) {
    fmt.Printf("I'm printing %s", arg)
}

func PrintThisAndThat(arg1, arg2 string) {
    fmt.Printf("Now printing %s and %s", arg1, arg2)
}

func Invoke(fn interface{}, args ...string) {
    //fn(args...)
}

func main() {
    Invoke(PrintThis, "foo")
    Invoke(PrintThisAndThat, "foo", "bar")
}

这不是实际的生产代码,但这是简化的版本。

问题:-如果取消注释该行,则会//fn(args...)出现编译错误prog.go:14: cannot call non-function fn (type interface {})

如何执行通过Invoke()函数作为参数接收的函数?

什么是实现此目标的正确方法?


问题答案:

您可以使用的CallCallSlice方法reflect.Value将其作为函数调用。与所有reflect.Value方法一样,这种恐慌是fn错误的类型。

func Invoke(fn interface{}, args ...string) {
    v := reflect.ValueOf(fn)
    rargs := make([]reflect.Value, len(args))
    for i, a := range args {
        rargs[i] = reflect.ValueOf(a)
    }
    v.Call(rargs)
}

http://play.golang.org/p/xGmNLDcLL_



 类似资料:
  • 问题内容: 为什么在接口中使用的变量是PUBLIC STATIC FINAL?为什么特别是“静态”? 问题答案: 无论如何,在接口中声明的字段只能是常量,那么为什么它取决于您使用哪个实例来访问它? 无论如何,将字段放在接口中通常都是不好的样式。该接口旨在反映实现该接口的类的功能-这与常量的概念完全正交。使用接口 只是 声明一堆常量肯定是一个讨厌的主意。我偶尔会发现使接口类型公开简单的实现很有用,例

  • 我是kotlin的新手,我总是编写java。我尝试了kotlin以java方式编写的一些函数代码,但不起作用。 我将这些代码翻译成java,它就可以工作了。 即使FInter是java接口。它也不起作用。 使现代化 我尝试了一些不同的方法,现在它们都是工作。

  • 问题内容: 在进行中,是否可以通过某种方式动态地转换变量? 例如,如果简单的转换将是: 如果我事先不知道年龄是整数怎么办?一种简单的书写方式是 有没有办法实现这样的目标?反射包提供了一些在运行时确定或强制转换类型的方法-但我找不到像上述提到的东西(适用于所有类型的通用方案)。 问题答案: 不,你不能。Go是一种静态类型的语言。变量的类型在编译时确定。 如果要动态确定的,可以使用类型切换:

  • Go 语言中的接口和现实生活中的 USB 插槽很像,它定义某种标准,但不关心具体实现 无论你到哪个商店里面去购买USB线,只要你告诉商家你需要一根USB线,买回家之后就一定能插到电脑上使用,之所以能用,原因就是电脑厂商在指定了USB插槽的标准(尺寸、排线等等),生产厂家只需要按照标准生产即可 同样在 Go 语言中我们可以通过接口来定义某种标准(函数声明),但不用不关心具体实现(函数实现),只要将来

  • 问题内容: 在Golang中,我们将结构体与接收器方法结合使用。到这里为止一切都很完美。 我不确定什么是接口。我们在结构中定义方法,如果要在结构上实现方法,则无论如何都要在另一个结构下再次编写该方法。 这意味着接口似乎只是方法定义,仅占用了页面上多余的空间。 有没有解释我为什么需要接口的示例? 问题答案: 接口太大了,不能在这里给出全面的答案,但是有些事情需要弄清楚它们的用途。 接口是一种 工具

  • 我想使用广播接收器在固定时间调用此方法的警报 } 删除所有消息,但没有发生,请提前帮我谢谢 /***删除所有消息。0-成功删除。1-没有要*删除的内容。*/ 我正在使用这个广播接收器 正如你所说我做了我创建了一个活动 公共类Active扩展PendingMessages实现Runnable{ } 然后打电话过去 context.start服务(新意图(上下文,Activity.class)); 但