Создание массива расширенных типов - PullRequest
3 голосов
/ 12 июля 2011

У меня есть структура A, расширяющая («подклассифицирующая») ее структурой B, например:

package main

type A struct {
    x int
}

type B struct {
    A
    y int
}

Я хочу создать массив, к которому я могу добавить A или B, чтобыэтот код работает:

func main() {
    var m [2]B

    m[0] = B { A { 1 }, 2 }
    m[0].x = 0
    m[0].y = 0

    m[1] = A { 3 }
    m[1].x = 0
}

Это не так.Если я создаю массив типа B, я получаю «не могу использовать struct literal (тип A) как тип B в присваивании».Если я пытаюсь создать массив типа A, я получаю ту же ошибку (только с обращенными типами).

Так что мой вопрос: каким типом должен быть массив?

Ответы [ 2 ]

3 голосов
/ 12 июля 2011

Вы можете использовать struct значения. Например,

package main

import "fmt"

type A struct {
    x int
}

type B struct {
    A
    y int
}

func main() {
    var m []interface{}
    m = append(m, B{A{1}, 2})
    m = append(m, A{3})
    fmt.Println(m[0], m[1])
    if b, ok := m[0].(B); ok {
        b.x = 0
        b.y = 0
        m[0] = b
    }
    if a, ok := m[1].(A); ok {
        a.x = 0
        m[1] = a
    }
    fmt.Println(m[0], m[1])
}

Output:
{{1} 2} {3}
{{0} 0} {0}

Или вы можете использовать struct указатели. Например,

package main

import "fmt"

type A struct {
    x int
}

type B struct {
    A
    y int
}

func main() {
    var m []interface{}
    m = append(m, &B{A{1}, 2})
    m = append(m, &A{3})
    fmt.Println(m[0], m[1])
    if b, ok := m[0].(*B); ok {
        b.x = 0
        b.y = 0
    }
    if a, ok := m[1].(*A); ok {
        a.x = 0
    }
    fmt.Println(m[0], m[1])
}

Output:
&{{1} 2} &{3}
&{{0} 0} &{0}
2 голосов
/ 12 июля 2011

Вы хотите определить тип массива interface{}, а не B.Тогда вы можете хранить оба типа там.Это единственный способ сделать это.Если оба типа реализуют определенный интерфейс, вы можете ввести его вместо универсального interface{}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...