Встроенная структура или вложенная структура? - PullRequest
1 голос
/ 20 апреля 2019

Является ли следующий код примером Embedded Struct или Nested 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)
}

Ответы [ 2 ]

3 голосов
/ 20 апреля 2019

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
0 голосов
/ 20 апреля 2019

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...