Встроенная структура или вложенная структура?

#go #struct

#Вперед #структура

Вопрос:

Является ли следующий код примером встроенной структуры или вложенной структуры или чего-то еще? И используем ли мы один тип структуры (person) в структуре другого типа (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)
}
  

Ответ №1:

Спецификация ссылается на это как на встроенное поле:

Поле, объявленное с типом, но без явного имени поля, называется встроенным полем. […]

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

Я не уверен, что вы подразумеваете под «использованием одного типа структуры в другом типе структуры», но вы используете person inside 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
  

Ответ №2:

Это как встроенная, так и вложенная структура. И вы можете следовать соглашению об именовании, первое слово должно быть прописным.

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