如何在Go中动态更改功能参数类型

时间:2019-01-15 06:04:03

标签: go

我有一个程序如下。我正在尝试动态更改函数参数的类型,因为我正在使用的另一个库要求传递带有具体类型的myMethod签名而不是该接口来进行适当的编组。在Go中甚至可以动态地生成具有动态生成的参数类型的函数或匿名函数,或者更改函数的参数类型吗?

package main

import (
    "fmt"
    "reflect"
)

type MyType interface {
    doThis()
}

type MyType1 struct{}

func (m MyType1) doThis() {
    fmt.Println("Type1 doThis")
}

type MyType2 struct{}

func (m MyType2) doThis() {
    fmt.Println("Type2 doThis")
}

func myMethod(myType MyType) {
    myType.doThis()
}

func main() {
    fmt.Println("Hello, playground")
    var type1 MyType
    type1 = &MyType1{}
    type1Val := reflect.TypeOf(type1)
    // TODO - change myMethod signature dynamically to accept type1Val as the type
}

这是GoPlay link

修改:添加说明

我正在使用的库公开了registerSomething(someFunc),其中someFunc的输入参数类型将在以后的一些编组中使用。如果输入参数类型是接口,则解组将返回一个映射。如果它是类型化的结构,则解组将返回带有正确填充所有参数的类型化的结构,因此我不必处理解组。

1 个答案:

答案 0 :(得分:4)

  

如何在go [?]中动态更改函数参数类型?

您根本无法。 Go是静态输入的。

(使代码运行很简单,但可能不是您想要的:

type1Val := reflect.ValueOf(type1)
myMethod(*(type1Val.Interface().(*MyType1)))

而且我不得不承认,我不明白您要在此处反映的内容。