[英]Embedded Struct or Nested Struct?
以下代码是嵌入式结构或嵌套结构的示例还是其他什么? 我们在另一个类型struct(secretAgent)中使用一个结构类型(person)吗?
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)
}
规范将其称为嵌入字段 :
使用类型但没有显式字段名称声明的字段称为嵌入字段 。 [...]
struct { T1 // field name is T1 ... }
我不确定你在“在另一个结构类型中使用一个结构类型”是什么意思,但你通过在另一个结构类型中嵌入一个结构类型来使用secretAgent
的person
。 在大多数情况下, 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
它是嵌入式和嵌套式结构。 并且您可以遵循命名约定,第一个单词应该是大写。
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)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.