使用container/list
,可以轻松地使对象管理列出的元素,并按顺序访问每个元素。
但似乎每个元素.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)
}
(整个代码在这里:http://play.golang.org/p/AMWqdPymHq)
如何访问element.Value自己的属性,或在构造列表对象时应用类型?
答案 0 :(得分:4)
如果您知道该列表包含Person
值,则可以使用类型断言从interface{}
变量中检索该值:
person := p.Value.(Person)
您现在可以完全访问该值并可以访问其字段。请注意,person
是p.Value
中存储的值的副本,因此修改person
不会修改列表中的值项。您可以通过(a)将修改后的person
分配回列表中的p.Value
或(b)存储*Person
指针来解决此问题。
如果列表项不包含Person
值,则上述代码将出现混乱。如果您知道列表将始终包含该类型的值,那就没问题了。否则,您可以使用双返回类型断言语法:
person, ok := p.Value.(Person)
如果类型不匹配,则会将ok
设置为false
。对于更复杂的情况,您还可以使用type switch。