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

use*_*885 0 struct nested 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"]}}
Run Code Online (Sandbox Code Playgroud)

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

请提出一种初始化 DetailsFilter 的方法。我尝试执行在 Golang初始化嵌套结构中描述的方法,但即使这样也不起作用。

icz*_*cza 5

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

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

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

输出:

{Filter:{Name:myname ID:123}}
Run Code Online (Sandbox Code Playgroud)

更短的选择

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

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

输出:

{Filter:{Name:myname2 ID:321}}
Run Code Online (Sandbox Code Playgroud)

Go Playground上试一试。

命名匿名结构类型

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

type Filter struct {
    Name string
    ID   int
}

type DetailsFilter struct {
    Filter Filter
}
Run Code Online (Sandbox Code Playgroud)

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

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

输出(在Go Playground上试试):

{Filter:{Name:myname ID:123}}
Run Code Online (Sandbox Code Playgroud)