如何访问属于vector.Vector的struct字段?

时间:2012-01-17 05:31:08

标签: go

我正在寻求帮助,了解如何访问container.vector.Vector中的struct字段。

以下代码:

package main

import "fmt"
import "container/vector"

func main() {
    type Hdr struct {
        H string
    }
    type Blk struct {
        B string
    }

    a := new(vector.Vector)

    a.Push(Hdr{"Header_1"})
    a.Push(Blk{"Block_1"})

    for i := 0; i < a.Len(); i++ {
        fmt.Printf("a.At(%d) == %+v\n", i, a.At(i))
        x := a.At(i)
        fmt.Printf("%+v\n", x.H)
    }
}

产生错误prog.go:22: x.H undefined (type interface { } has no field or method H)

删除第21行和第22行会产生:

a.At(0) == {H:Header_1}
a.At(1) == {B:Block_1}

那么,一个人如何访问'H'或'B'?看起来我需要将这些接口转换为结构,但是......我不知道。我很茫然。

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

使用转到type switchtype assertion来区分HdrBlk类型。例如,

package main

import (
    "fmt"
    "container/vector"
)

func main() {
    type Hdr struct {
        H string
    }
    type Blk struct {
        B string
    }

    a := new(vector.Vector)

    a.Push(Hdr{"Header_1"})
    a.Push(Blk{"Block_1"})

    for i := 0; i < a.Len(); i++ {
        fmt.Printf("a.At(%d) == %+v\n", i, a.At(i))
        x := a.At(i)
        switch x := x.(type) {
        case Hdr:
            fmt.Printf("%+v\n", x.H)
        case Blk:
            fmt.Printf("%+v\n", x.B)
        }
    }
}

但是,有效weekly.2011-10-18发布:

  

容器/矢量包已被删除。切片更好:   SliceTricks

因此,对于最新版本,

package main

import "fmt"

func main() {
    type Hdr struct {
        H string
    }
    type Blk struct {
        B string
    }

    var a []interface{}

    a = append(a, Hdr{"Header_1"})
    a = append(a, Blk{"Block_1"})

    for i := 0; i < len(a); i++ {
        fmt.Printf("a[%d]) == %+v\n", i, a[i])
        x := a[i]
        switch x := x.(type) {
        case Hdr:
            fmt.Printf("%+v\n", x.H)
        case Blk:
            fmt.Printf("%+v\n", x.B)
        }
    }
}