如何在 Golang 中访问 list.Element.Value 自己的属性?

oti*_*i10 1 go

使用container/list,可以很容易地使对象管理列出的元素,并按顺序访问每个元素。

但似乎每个 element.Value 都不允许访问它自己的从用户定义类型派生的属性,因为类型element.Valueinterface{}

for p := members.Front(); p != nil; p = p.Next() {
    fmt.Printf("This is Person -> %+v\n", p.Value)
    fmt.Printf("This is also `Person` -> %T\n\n", p.Value)
    // fmt.Printf("But cannnot access Person.Name %s\n", p.Value.Name)
}
Run Code Online (Sandbox Code Playgroud)

(这里的完整代码:http : //play.golang.org/p/AMWqdPymHq

如何访问 element.Value 自己的属性,或在构造列表对象时应用该类型?

Jam*_*dge 5

如果您知道列表包含Person值,则可以interface{}使用类型断言从变量中检索该值:

person := p.Value.(Person)
Run Code Online (Sandbox Code Playgroud)

您现在可以完全访问该值并可以访问其字段。请注意,这person是存储在 中的值的副本p.Value,因此修改person不会修改列表中的值项。您可以通过 (a) 将修改person后的内容分配回p.Value或 (b) 将*Person指针存储在列表中来解决此问题。

如果列表项不包含Person值,则上面的代码会发生混乱。如果您知道列表将始终包含该类型的值,那很好。否则,您可以使用双返回类型断言语法:

person, ok := p.Value.(Person)
Run Code Online (Sandbox Code Playgroud)

如果类型不匹配,它将改为设置okfalse。对于更复杂的情况,您还可以使用类型 switch