2012-01-17 1 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) 
    } 
} 

は生産ライン21及び22を除去するエラーprog.go:22: x.H undefined (type interface { } has no field or method H)

を生成:

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

したがって、正確に一つのアクセス 'H' または「Bを行う方法'?私はそれらのインターフェイスを構造体に変換する必要があるようですが、私は気にしません。私は迷っている。

ありがとうございました。

+1

'コンテナ/ vector'パッケージは、2011年9月1日以降廃止されており、もはや標準ライブラリの一部ではありません。スライスと[SliceTricks](http://code.google.com/p/go-wiki/wiki/SliceTricks)を代わりに使用してください。 – tux21b

答えて

4

HdrBlkの種類を区別するために、Go type switchまたはtype assertionを使用してください。例えば、しかし

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

+0

Ack!私はまだコメントシステムに慣れています。 – mtw

+0

@mtw:これがあなたの質問に対する答えだったら、答えの投票番号の下にあるチェックマークの記号をクリックしてください。) – thwd

関連する問題