如何在go中初始化嵌套结构?

时间:2015-05-07 13:43:30

标签: struct go nested

嗨,我对Golang很新,请帮助我。我在struct中定义了一个struct。但是当我尝试初始化主结构时,我收到错误。

type DetailsFilter struct {
  Filter struct {
    Name    string        
    ID      int                           
  } 
}

var M map[string]interface{}
M = make(map[string]interface{})
M["Filter"] = map[string]interface{}{"Name": "XYZ", "ID": 5}
var detailsFilter = DetailsFilter{Filter: M["Filter"]}}

我得到的错误是:不能在字段值中使用(类型interface {})作为类型struct:需要类型断言。

请建议初始化DetailsFilter的方法。 我尝试了Initialize a nested struct in Golang中描述的方法,但即使这样也行不通。

2 个答案:

答案 0 :(得分:3)

不幸的是,如果结构字段的类型是匿名结构,在构造时,则只能通过"复制"来初始化它。匿名结构类型(再次指定):

type DetailsFilter struct {
    Filter struct {
        Name string
        ID   int
    }
}

df := DetailsFilter{Filter: struct {
    Name string
    ID   int
}{Name: "myname", ID: 123}}
fmt.Println(df)

输出:

{Filter:{Name:myname ID:123}}

更短的替代

所以我建议不要在构造时初始化它,而是在创建零值结构之后,如下所示:

df = DetailsFilter{}
df.Filter.Name = "myname2"
df.Filter.ID = 321
fmt.Printf("%+v\n", df)

输出:

{Filter:{Name:myname2 ID:321}}

Go Playground上尝试。

命名匿名结构类型

或者根本不使用匿名结构作为字段类型,将类型命名为:

type Filter struct {
    Name string
    ID   int
}

type DetailsFilter struct {
    Filter Filter
}

然后你可以像这样简单地初始化它:

df := DetailsFilter{Filter: Filter{Name: "myname", ID: 123}}
fmt.Printf("%+v\n", df)

输出(在Go Playground上尝试):

{Filter:{Name:myname ID:123}}

答案 1 :(得分:0)

编译器的M["Filter"]类型为interface{}。运行时的类型是map[string]interface{}。这些都不能转换为Filter字段的匿名结构类型。

您应该为过滤器定义一个类型,或者根本没有它。为什么不

type DetailsFilter struct {
   Name    string        
   ID      int                           
} 

M := make(map[string]*DetailsFilter)
M["Filter"] = &DetailsFilter{"Name": "XYZ", "ID": 5}
var detailsFilter = M["Filter"]

我不确定为什么你需要嵌套的匿名结构。通常,除非您确实需要,否则不需要使用interface{}。这通常是你打击类型系统而不是拥抱它的标志。

你不应该使用这样的匿名结构的原因是没有干净的方法来初始化它。您有两种选择:

1-在struct literal中重复类型定义:

x := DetailsFilter{Filter: struct {
    Name string
    ID   int
}{Name: "Foo", ID: 5}}

2-设置单个字段:

x := DetailsFilter{}
x.Filter.Name = "Foo"
x.Filter.ID = 5

如果要使用struct literals创建它们,为嵌套字段创建实际类型似乎更容易。