Как получить доступ к структурным полям, которые являются частью вектора. Вектор? - PullRequest
2 голосов
/ 17 января 2012

Я ищу помощь в понимании того, как получить доступ к полям структуры, которые находятся внутри container.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 Ответ

4 голосов
/ 17 января 2012

Используйте переключатель типа Go или для подтверждения типа , чтобы различать типы 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)
        }
    }
}

Однако, эффективная версия еженедельно 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)
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...