说我有这样的结构:
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函数。
答案 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 }
答案 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结构。