ch15、面向对象编程-行为的定义和实现( 二 )

3、匿名属性

  • 没有指定属性名称,只有属性的类型, 我们称之为匿名属性
  • 任何有命名的数据类型都可以作为匿名属性(int、float、bool、string、struct等)
package mainimport "fmt"func main() {type Person struct {intfloat32boolstring}// 不指定名称初始化per1 := Person{3, 3.14, false, "lnj"}fmt.Println(per1)// 可以把数据类型作为名字显示初始化per2 := Person{int:3,float32: 3.14,bool:true,string:"lnj",}fmt.Println(per2)// 可以把数据类型当做属性名称操作结构体per2.int = 666fmt.Println(per2.int) // 666}
  • Go语言中最常见的匿名属性是用结构体类型作为匿名属性
package mainimport "fmt"func main() {type Person struct {name stringageint}type Student struct {Person // 匿名属性classstring}stu := Student{Person{"lnj", 33},"学前一班",}fmt.Println(stu) // {{lnj 33} 学前一班}}
  • 如果结构体作为匿名属性, 想访问匿名属性的属性有两种方式
package mainimport "fmt"func main() {type Person struct {name stringageint}type Student struct {Person // 匿名属性classstring}stu := Student{Person{"lnj", 33},"学前一班",}fmt.Println(stu) // {{lnj 33} 学前一班}// 方式一: 先找到匿名属性,再访问匿名属性中的属性stu.Person.name = "zs"fmt.Println(stu) // {{zs 33} 学前一班}// 方式二: 直接访问匿名属性中的属性// 系统会先查找当前结构体有没有名称叫做name的属性// 如果没有会继续查找匿名属性中有没有名称叫做name的属性stu.name = "ww"fmt.Println(stu) // {{ww 33} 学前一班}}
  • 注意点: 如果多个匿名属性的属性名称相同,那么不能通过方式二操作,只能通过方式一
package mainimport "fmt"func main() {type Person struct {name stringageint}type Class struct {name stringtime string}type Student struct {Person // 匿名属性Class// 匿名属性}stu := Student{Person{"lnj", 33},Class{"学前一班", "2020-12-12"},}fmt.Println(stu) // {{lnj 33} {学前一班 2020-12-12}}// 编译报错, 系统搞不清楚要找哪个name//stu.name = "zs"stu.Person.name = "zs"stu.Class.name = "小学一年级"fmt.Println(stu) // {{zs 33} {小学一年级 2020-12-12}}}
  • 注意点: 只有匿名结构体才支持向上查找
package mainimport "fmt"func main() {type Person struct {name string}type Student struct {per Personage int}var stu Student = Student{Person{"lnj"}, 18}//fmt.Println(stu.name) // 报错fmt.Println(stu.per.name) // 必须通过属性进一步查找fmt.Println(stu.age)}
  • 注意点: 如果匿名属性是一个结构体类型, 那么这个结构体类型不能是自己
package mainfunc main() {type Person struct {Person // 错误namestring}type Student struct {*Student // 正确, 链表ageint}var stu Student = Student{age: 32}var stu2 Student = Student{&stu, 18}fmt.Println(stu)fmt.Println(stu2)}




推荐阅读