如何在Go中嵌套结构

时间:2019-01-09 02:34:31

标签: go data-structures struct

我正在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 :(得分:2)

我可能会误会,但是您是否要求嵌套嵌套的结构?为此,只需使用[]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问题。将第一个字母更改为大写(即TubeAMP [请参见https://github.com/golang/go/wiki/CodeReviewComments#initialisms)以访问来自不同包的结构。

答案 1 :(得分:0)

目前尚不清楚您到底要达到什么目的(这里的背景/大局是什么?),但是请考虑一下:

您可以在管中添加另一个标志以指定其类型,然后具有类型数组

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}