无法通过方法与struct进行交互?

时间:2018-01-27 11:16:48

标签: go struct

我的问题是,我有指定的应用:

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循环内看不到这些包中的方法。 :(

我会因任何线索而受到高度赞赏。 提前谢谢

1 个答案:

答案 0 :(得分:0)

首先,您所做的已经创建了一个包含字段fieldafieldb的新数组。它与您的结构AB无关。所以基本上你不能调用方法someMethod()

structPool = []struct {
    fielda string
    fieldb string
}{}

您需要实现接口来操作这些结构。

定义类似

的界面
type Common interface {
    someMethod() string
}

您的结构AB都已实现此界面。

现在使用AB的数据制作此接口的数组。

structPool := []Common{
        A{"x", "y"},
        B{"x", "y"},
}

迭代此数组structObj.someMethod()

希望这会有所帮助。

如有必要,请参阅: playground

另一个例子:https://gobyexample.com/interfaces

其他参考:http://www.golangbootcamp.com/book/interfaces