Golang - 具有多种输入类型的函数

时间:2016-11-03 19:43:07

标签: go

我是新手,无法弄清楚如何做一些非常基本的事情。假设我有以下两种结构:

type FooStructOld struct {
    foo1, foo2, foo3 int
}

type FooStructNew struct {
    foo1, foo2 int
}

然后我想要一个更新输入的函数。例如,对于单一类型:

func updateval(arg *FooStructOld) {
    arg.foo1 = 1
}

这可以按预期工作。但是我希望函数updateval能够将FooStructOld或FooStructNew作为输入。我知道我应该使用接口类型,但我不能让它工作。例如,当我尝试以下操作时:

我收到此错误:

arg.foo1 undefined (type interface {} is interface with no methods)
cannot assign interface {} to a (type *FooStructOld) in multiple assignment: need type assertion

有没有人知道这方面的解决方案?

1 个答案:

答案 0 :(得分:8)

您可以使用类型断言从interface{}

中提取值
func updateval(arg interface{}) {
    switch arg := arg.(type) {
    case *FooStructOld:
        arg.foo1 = 1
    case *FooStructNew:
        arg.foo1 = 1
    }
}

或者您可以实现执行更新的界面

type FooUpdater interface {
    UpdateFoo()
}

type FooStructOld struct {
    foo1, foo2, foo3 int
}

func (f *FooStructOld) UpdateFoo() {
    f.foo1 = 1
}

type FooStructNew struct {
    foo1, foo2 int
}

func (f *FooStructNew) UpdateFoo() {
    f.foo1 = 1
}

func updateval(arg FooUpdater) {
    arg.UpdateFoo()
}