2014-04-11 25 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

相關問題