如何在Go中嵌套结构

如何在Go中嵌套结构,go,data-structures,struct,Go,Data Structures,Struct,我正在研究Go中的结构、方法和接口,并且正在编写一些代码来测试这些概念。在我正在创建的一个示例中,我坚持以下概念-一些放大器有前置放大器管和功率管。我想我可以在amp结构中使用一个通用的管状结构来定义它们,但它当然不能像我写的那样工作,而且当我研究嵌套结构时,它们似乎不是适用的概念。我如何构造它,使“amp”有“preampubes”和“powertube”,而这两种类型都是“tube” **编辑:更新:** 我应该在问题中包括我所犯的错误。今天早上我重写了这个包,Premptube和Power

我正在研究Go中的结构、方法和接口,并且正在编写一些代码来测试这些概念。在我正在创建的一个示例中,我坚持以下概念-一些放大器有前置放大器管和功率管。我想我可以在amp结构中使用一个通用的管状结构来定义它们,但它当然不能像我写的那样工作,而且当我研究嵌套结构时,它们似乎不是适用的概念。我如何构造它,使“amp”有“preampubes”和“powertube”,而这两种类型都是“tube”

**编辑:更新:** 我应该在问题中包括我所犯的错误。今天早上我重写了这个包,Premptube和PowerTube类型现在可以正常工作了。我怀疑问题在于我如何在主函数中实例化它们。下面的代码现在起作用了。这不是生产代码,只是实践概念的练习。谢谢你帮我重新审视它。
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)
}


我可能有点误解,但你是在要求结构的嵌套切片吗?要做到这一点,只需使用
[]管

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)
}


这里只是一个简单的例子,但是如果您的值存在于不同的包中,您也可能会遇到
import
问题。将第一个字母改为大写(即,<代码>管< /代码>,和<代码> AMP<代码> [C])以访问不同包中的结构。

< P>不清楚您想要实现什么(这里有上下文/大图),但请考虑:

您可以向管添加另一个标志以指定其类型,然后创建一个类型数组

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}

您的问题中包含的类型有什么问题?您遇到了什么问题?在我看来,
amp.premptube
amp.powertube
都正确地声明为类型
tube
“它没有按照我编写的方式工作”-怎么会这样?你所描述的似乎正是你的代码所定义的,所以不清楚问题出在哪里。当我昨晚在处理这个包时,我遇到了一个错误,我应该把它包括在问题中。我今天早上重新创建了这个包,看起来PowerTube和Premptube都正确声明了。我怀疑问题在于我如何在主函数中实例化amp类型。
tube{"model", 1, powertube}
tube{"model2", 2, preamptube}