我的问题是,我有指定的应用:
myapp
|- app/main.go
|- data/a.go
|- data/b.go
在a.go中我有结构方法
package data
type A struct {
Field_a string
Field_b string
}
func (a A) SomeMethod() string {
return "somemethod A"
}
在b.go中类似:
package data
type B struct {
Field_a string
Field_b string
}
func (b B) SomeMethod() string {
return "somemethod B"
}
现在我以这种方式在main.go中引用:
package main
import (
"fmt"
"myapp/data"
)
func main() {
a := data.A{"x","y"} // it works
b := data.B{"x","y"} // works as well
c := data.A{"x","y"}.SomeMethod() // works
d := data.B{"x","y"}.SomeMethod() // works too
fmt.Printf("a: %T\n",a)
fmt.Printf("b: %T\n",b)
fmt.Printf("c: %T\n",c)
fmt.Printf("d: %T\n",d)
}
但我遇到的问题是我想从包数据中迭代这些结构,并且我尝试了以下方法:
structPool := []struct{
fielda string
fieldb string
}{
data.A{"x","y"}, // data.A{"x","y"}.SometMethod() is valid at this point
data.B{"x","y"}, // data.B{"x","y"}.SometMethod() is valid at this point
}
for _, structObj := range structPool {
// can't use here structObj.SomeMethod() - why?
}
我还试图像这样初始化这个切片structPool
:
[]interface{}
或[]struct{}
等但仍然编译器在for
循环内看不到这些包中的方法。 :(
我会因任何线索而受到高度赞赏。 提前谢谢
答案 0 :(得分:0)
首先,您所做的已经创建了一个包含字段fielda
和fieldb
的新数组。它与您的结构A
和B
无关。所以基本上你不能调用方法someMethod()
。
structPool = []struct {
fielda string
fieldb string
}{}
您需要实现接口来操作这些结构。
定义类似
的界面type Common interface {
someMethod() string
}
您的结构A
和B
都已实现此界面。
现在使用A
和B
的数据制作此接口的数组。
structPool := []Common{
A{"x", "y"},
B{"x", "y"},
}
迭代此数组structObj.someMethod()
希望这会有所帮助。
如有必要,请参阅: playground