我正在寻求帮助,了解如何访问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'?看起来我需要将这些接口转换为结构,但是......我不知道。我很茫然。
感谢您的帮助。
答案 0 :(得分:4)
使用转到type switch或type assertion来区分Hdr
和Blk
类型。例如,
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)
}
}
}