如何在go中初始化嵌套结构?
How to initialise nested structs in go?
嗨,我是 Golang 的新手,请帮助我。我在结构中定义了一个结构。但是当我尝试初始化主结构时出现错误。
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"]}}
我得到的错误是:不能将 (type interface {}) 用作字段值中的类型结构:需要类型断言。
请建议一种初始化 DetailsFilter 的方法。
我尝试使用 Initialize a nested struct in Golang 中描述的方法,但即使这样也行不通。
编译器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- 在结构字面量中重复类型定义:
x := DetailsFilter{Filter: struct {
Name string
ID int
}{Name: "Foo", ID: 5}}
2- 设置个别字段:
x := DetailsFilter{}
x.Filter.Name = "Foo"
x.Filter.ID = 5
如果您想使用结构文字创建嵌套字段,为它们创建真实类型似乎更容易。
不幸的是,如果结构字段的类型是匿名结构,在构建时你只能通过"duplicating"匿名结构类型(再次指定)初始化它):
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}}
嗨,我是 Golang 的新手,请帮助我。我在结构中定义了一个结构。但是当我尝试初始化主结构时出现错误。
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"]}}
我得到的错误是:不能将 (type interface {}) 用作字段值中的类型结构:需要类型断言。
请建议一种初始化 DetailsFilter 的方法。 我尝试使用 Initialize a nested struct in Golang 中描述的方法,但即使这样也行不通。
编译器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- 在结构字面量中重复类型定义:
x := DetailsFilter{Filter: struct {
Name string
ID int
}{Name: "Foo", ID: 5}}
2- 设置个别字段:
x := DetailsFilter{}
x.Filter.Name = "Foo"
x.Filter.ID = 5
如果您想使用结构文字创建嵌套字段,为它们创建真实类型似乎更容易。
不幸的是,如果结构字段的类型是匿名结构,在构建时你只能通过"duplicating"匿名结构类型(再次指定)初始化它):
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}}