【问题标题】:create struct containing fields of another struct创建包含另一个结构的字段的结构
【发布时间】:2017-05-16 15:42:49
【问题描述】:

如何使用另一个结构的字段创建结构

struct box {
    x int
    y int
}

struct textbox {
    BOXVALUES
    text string
}

【问题讨论】:

  • 请发送tour,学习提出好问题stackoverflow.com/help/how-to-ask,发送minimal reproducible example。如果您的问题与发生的错误无关,则 mcve 应该可以无错误地编译。使用 cmets 插入您的伪代码,例如/* BOXVALUES */。还显示代码以说明您希望如何使用生成的结构。 IE。编写一些可编译的代码来访问文本框类型的变量中的成员“字符串”。附有注释中的另一个伪代码,以显示您对如何访问变量内的成员“x”的想法。
  • 是什么阻止您在结构文本框内声明类型为 box 的成员并将其作为 MyTextboxVariable.BoxMember.x 访问?

标签: go struct


【解决方案1】:

Go 没有像 Java 那样的继承概念,你可以说 textbox 是 box 的子项,因此继承了它的字段。

所以你可以这样做: 输入框结构 { x 整数 整数 }

type textbox struct {
  box
  text string
}

通过指定类型box 而不指定结构字段名称,您可以复制box 结构中定义的字段int textbox。但是,在构建过程中,您仍然必须将 box 字段显式初始化为:

t := textbox {
  box: box{
    x: 1,
    y: 2,
  },
  text: "aoeu",
}

但是您不再需要在textbox 中引用box 进行访问,例如:

println(t.x)

Go 在这方面有点奇怪,因为struct 不是一个对象,所以textbox 实际上并没有从box 继承,而是将其复制到其中并带有一些语法糖以供访问。

【讨论】:

    【解决方案2】:

    我们至少有两种方式:

    案例1:调用Embed

    struct textbox {
        box
        text string
    }
    

    案例2:包含子结构

    struct textbox {
        boxValue box
        text string
    }
    

    但我认为你应该学习基础课程。这是一个基本概念。

    【讨论】:

      【解决方案3】:

      不熟悉 GO...但给出的语法看起来像你想要的

      struct textbox
      {
          BOXVALUES box
          text string
      }
      

      根据你给出的语法,此时结构应该包含一个

      fieldname DataType
      

      在您的文本框示例中,您缺少 DataType...如 int、string、float 等。您的 box 结构基本上是一个新的 DataType,因此您可以使用它来代替您想要 DataType 的位置。

      【讨论】:

      • 这个答案在两个方面的 go 语法方面是不准确的 - { 在它自己的行上不​​是像 C 中那样的有效语法,并且结构内的唯一标识符 BOXVALUES 可以引用一个结构或接口类型,在这种情况下,字段名称与类型名称相同(尽管这些称为匿名字段)
      猜你喜欢
      • 1970-01-01
      • 2014-07-06
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-28
      • 2012-07-30
      • 1970-01-01
      相关资源
      最近更新 更多