添加结构或指向结构的指针以切片

时间:2018-12-02 00:36:44

标签: go

说我有这样的结构:

type Foo struct {
  F string `zoom:"1"`
}

type Bar struct {
  F string `zoom:"2"`
}

type Baz struct {
  F string `zoom:"3"`
}

说我想创建一个可以从每个结构中提取f字段的函子,它看起来像:

func extractField(s []struct{}){
  for _, v := range s {
    t := reflect.TypeOf(v{})
    f, _ := t.FieldByName("F")
    v, ok := f.Tag.Lookup("zoom")
  }
}

有没有一种方法可以将结构传递给extractField?如果我这样做:

extractField([]struct{}{Foo, Bar, Baz})

我收到此错误:

Type Foo is not an expression
Type Bar is not an expression
Type Baz is not an expression

我只想将3个结构传递给extractField函数。

3 个答案:

答案 0 :(得分:2)

我想出办法的唯一方法是:

type Foo struct {
    F string `zoom:"1"`
}

type Bar struct {
    F string `zoom:"2"`
}

type Baz struct {
    F string `zoom:"3"`
}


func extractField(s []interface{}){
    for _, v := range s {
        t := reflect.TypeOf(v)
        f, _ := t.FieldByName("F")
        v, ok := f.Tag.Lookup("zoom")
        fmt.Println(v,ok)
    }
}

func main(){

    extractField([]interface{}{Foo{},Bar{},Baz{}})  // <<<< here

}

不确定是否有一种方法可以先传递结构而不先“实例化”。

答案 1 :(得分:2)

总体问题似乎与接口类型更好地匹配。

tableView(_:cellForRowAt:)

定义这些方法很容易,例如

type HasF interface {
    GetF() string
}

您遍历它们的方法几乎变得微不足道

func (foo Foo) GetF() string { return foo.F }

https://play.golang.org/p/uw0T7TGVC0n具有完整的版本。

答案 2 :(得分:2)

原始代码看起来像是遵循JavaScript方法的,其中函数会变异对象。 Go稍有不同,自变异更为常见。

例如:

type Generic struct {
  field string
}

func (generic *Generic) Value () string {
  return generic.field
}

someObject := &Generic{
  field: "some value",
}

log.Print(someObject.Value()) // Outputs "some value"

如果您来自JavaScript界,请把结构想像成可以包含属性和函数的对象/类。在实例化实例之前,结构只是一个定义。这与JavaScript中的对象和数据的定义是同时定义的不同。

另一个答案指出,接口是解决此问题的另一种类似方法。

说明

用JavaScript来讲,OP试图做类似于以下的事情:

class Foo {...}
class Bar {...}
class Baz {...}

extractField(Foo, Bar, Baz)

在JS语言中,这会将类定义传递给extractField方法。如果您想操纵/读取一个类的实例,则仍然必须实例化它,例如:

extractField(new Foo(), new Bar(), new Baz())

这基本上就是完成的事情

extractField([]interface{}{Foo{},Bar{},Baz{}})

我认为您遇到的问题是实例化了Foo / Bar / Baz结构,但没有实例化嵌套的F结构。