繁体   English   中英

嵌入式结构还是嵌套结构?

[英]Embedded Struct or Nested Struct?

以下代码是嵌入式结构或嵌套结构的示例还是其他什么? 我们在另一个类型struct(secretAgent)中使用一个结构类型(person)吗?

package main

import "fmt"

type person struct {
    first string
    last  string
    age   int
}

type secretAgent struct {
    person
    ltk bool
}

func main() {

    sa1 := secretAgent{
        person: person{
            first: "James",
            last:  "Bond",
            age:   32,
        },
        ltk: true,
    }

    fmt.Println(sa1.first, sa1.last, sa1.age, sa1.ltk)
}

规范将其称为嵌入字段

使用类型但没有显式字段名称声明的字段称为嵌入字段 [...]

 struct { T1 // field name is T1 ... } 

我不确定你在“在另一个结构类型中使用一个结构类型”是什么意思,但你通过在另一个结构类型中嵌入一个结构类型来使用secretAgentperson 在大多数情况下, person字段也被提升为像secretAgent成员:

提升字段的作用类似于结构的普通字段,除了它们不能用作结构的复合文字中的字段名称。

所以你可以说:

sa1 := secretAgent{
    person: person{
        first: "James",
        last:  "Bond",
        age:   32,
    },
    ltk: true,
}

sa1.first

但不是:

sa1 := secretAgent{
    first: "James",
    last:  "Bond",
    age:   32,
    ltk: true,
}

您还可以通过此person明确引用嵌入的person字段:

// As a promoted field...
sa1.first
// More explicitly...
sa1.person.first

它是嵌入式和嵌套式结构。 并且您可以遵循命名约定,第一个单词应该是大写。

package main

import "fmt"

type Name struct{
    first string
    last  string
}

type Person struct {
    name  Name  
    age   int
}

type SecretAgent struct {
    person Person
    ltk bool
}

func main() {

    sa1 := secretAgent{
        person: Person{
            name: Name {
               first: "James",
               last:  "Bond"
            },
            age:   32,
        },
        ltk: true,
    }

    fmt.Println(sa1.person.first, sa1.person.last, sa1.person.age, sa1.ltk)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM