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

时间:2014-04-11 05:52:47

标签: go

使用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自己的属性,或在构造列表对象时应用类型?

1 个答案:

答案 0 :(得分:4)

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

person := p.Value.(Person)

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

如果列表项不包含Person值,则上述代码将出现混乱。如果您知道列表将始终包含该类型的值,那就没问题了。否则,您可以使用双返回类型断言语法:

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

如果类型不匹配,则会将ok设置为false。对于更复杂的情况,您还可以使用type switch