【问题标题】:How to nest structures in Go如何在 Go 中嵌套结构
【发布时间】:2019-01-09 02:34:30
【问题描述】:

我正在研究 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)
}

【问题讨论】:

  • 您在问题中包含的类型有什么问题?您遇到了什么问题?
  • 在我看来 amp.preamptubesamp.powertubes 都正确声明为类型 tube
  • “它不像我写的那样工作” - 怎么回事?你所描述的似乎正是你的代码定义的,所以不清楚问题是什么。
  • 昨晚我在处理包时遇到了一个错误,我应该将其包含在问题中。我今天早上重新创建了这个包,它确实显示 powertubes 和 preamptubes 都正确声明了。我怀疑问题出在我如何在主函数中实例化放大器类型。

标签: go data-structures struct


【解决方案1】:

我可能会误解,但您是在要求嵌套的结构切片吗?为此,只需使用[]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))以访问来自不同包的结构。

【讨论】:

    【解决方案2】:

    目前尚不清楚您到底想实现什么(这里的上下文/大图是什么?),但请考虑一下:

    你可以在管子上添加另一个标志来指定它的类型,然后有一个类型数组

    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}
    

    【讨论】:

      猜你喜欢
      • 2023-01-16
      • 1970-01-01
      • 2015-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-13
      相关资源
      最近更新 更多