Как вложить структуры в Go - PullRequest
0 голосов
/ 09 января 2019

Я работаю над структурами, методами и интерфейсами в Go и пишу некоторый код для проверки концепций. В примере, который я создаю, я застрял на следующей концепции: у некоторых усилителей есть предусилительные и силовые. Я думал, что смогу определить их в структуре amp, используя общую структуру ламп, но, конечно, это не работает так, как я это написал, и когда я исследую вложенные структуры, они, кажется, не применимы. Как мне структурировать это так, чтобы у «amp» были «preamptubes» и «powertubes», и каждый из них - это «tube»?

type tube struct {
    model  string
    number int8
}

type amp struct {
    name         string
    model        string
    manufacturer string
    color        string
    knobs        int8
    switches     int8
    jacks        int8
    preamptubes  tube
    powertubes   tube
    ouputpower   int8
    fxloop       bool
}
** Редактировать: Обновить: ** Я должен был включить ошибку, которую я получил в вопросе. Этим утром я переписал пакет, и типы предусилителей и ламповых ламп теперь работают как положено. Я подозреваю, что проблема была в том, как я выполнял их создание в основной функции. Следующее сейчас работает. Это не производственный код, а упражнение для отработки концепций. Спасибо, что помогли мне по-новому взглянуть на это.
package main

import "fmt"

type tube struct {
    model  string
    number int8
}

type amp struct {
    name         string
    model        string
    manufacturer string
    color        string
    knobs        int8
    switches     int8
    jacks        int8
    preamptubes  tube
    powertubes   tube
    ouputpower   int8
    fxloop       bool
}

func main() {
    a := amp{
        name:         "MegaAmp",
        model:        "MA9000",
        manufacturer: "Amps R Us",
        color:        "blonde",
        knobs:        9,
        switches:     5,
        jacks:        6,
        preamptubes: tube{
            model:  "12AX7",
            number: 3},
        powertubes: tube{
            model:  "6V6",
            number: 4},
        fxloop: true}

    fmt.Println(a)
    fmt.Println(a.preamptubes.model)
}

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Непонятно, чего именно вы пытаетесь достичь (каков контекст / общая картина здесь?), Но учтите это:

Вы можете добавить еще один флаг к трубе, чтобы обозначить его тип, а затем иметь массив типов

type tubekind int

const (
    preamptube tubekind = iota
    powertube
)

type tube struct {
    model  string
    number int8
    kind tubekind
}

type amp struct {
    tubes        []tube
    // ... other fields
}

Вы можете создать трубу следующим образом:

tube{"model", 1, powertube}
tube{"model2", 2, preamptube}
0 голосов
/ 09 января 2019

Возможно, я неправильно понимаю, но вы спрашиваете о вложенном фрагменте структур? Для этого просто используйте []tube:

package main

import "fmt"

type tube struct {
    model  string
    number int8
}

type amp struct {
    name         string
    model        string
    manufacturer string
    color        string
    knobs        int8
    switches     int8
    jacks        int8
    preamptubes  []tube
    powertubes   []tube
    ouputpower   int8
    fxloop       bool
}

func main() {
    v := amp{
        name:        "da amp",
        preamptubes: []tube{{model: "A"}},
        powertubes:  []tube{{model: "B"}},
    }

    fmt.Printf("%+v\n", v)
}

https://play.golang.org/p/bPGHuEO40D0

Здесь просто выстрел в темноте, но вы также можете столкнуться с import проблемами, если ваши значения существуют в отдельных пакетах. Изменение первой буквы в верхний регистр (т. Е. Tube и AMP [см. https://github.com/golang/go/wiki/CodeReviewComments#initialisms)) для доступа к структурам из разных пакетов.

...