2012-01-17 58 views
2

我在尋找幫助,瞭解如何訪問container.vector.Vector內部的結構字段。如何訪問屬於vector.Vector一部分的結構字段?

以下代碼:

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

的'容器/包裝VECTOR'以來一直2011-09-01棄用,是不是標準庫的一部分了。改爲使用切片和[SliceTricks](http://code.google.com/p/go-wiki/wiki/SliceTricks)。 – tux21b 2012-01-17 06:45:00

回答

4

使用Go 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) 
     } 
    } 
} 
+0

感謝您的幫助!這裏是原型代碼: – mtw 2012-01-17 07:11:31

+0

Ack!我仍然習慣評論系統。 – mtw 2012-01-17 07:17:45

+0

@mtw:如果這是你的問題的答案,請點擊答案上的投票號碼下的複選標記符號=) – thwd 2012-01-17 14:21:16