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

时间:2019-04-19 22:54:14

标签: go struct

以下代码是Embedded Struct还是Nested Struct或其他示例?而且我们是否在另一种类型的结构体(secretAgent)中使用一种结构体类型(人)?

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

2 个答案:

答案 0 :(得分:3)

spec将该字段称为嵌入字段

  

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

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

我不确定“在另一种结构类型中使用一种结构类型”是什么意思,但是您在person中使用secretAgent是通过将一种结构类型嵌入另一种结构类型。在大多数情况下,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

答案 1 :(得分:0)

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

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