以下代码是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)
}
答案 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)
}