2014-04-11 28 views
1

使用container/list,很容易让对象管理列出的元素,并顺序访问每个元素。如何访问Golang中的list.Element.Value自己的属性?

但似乎每个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) 
} 

(整个代码在这里:http://play.golang.org/p/AMWqdPymHq

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

回答

3

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

person := p.Value.(Person) 

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

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

person, ok := p.Value.(Person) 

这反而会设置okfalse如果类型不匹配。对于更复杂的情况,您也可以使用type switch

相关问题