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