使用container/list,可以很容易地使对象管理列出的元素,并按顺序访问每个元素。
但似乎每个 element.Value 都不允许访问它自己的从用户定义类型派生的属性,因为类型element.Value是interface{}
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 自己的属性,或在构造列表对象时应用该类型?
如果您知道列表包含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)
如果类型不匹配,它将改为设置ok为false。对于更复杂的情况,您还可以使用类型 switch。