我是新手,无法弄清楚如何做一些非常基本的事情。假设我有以下两种结构:
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
有没有人知道这方面的解决方案?
答案 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()
}