go 匿名成员
来源:原创
时间:2019-03-07
作者:脚本小站
分类:GoLang
匿名成员的使用:
package main import "fmt" type Person struct{ name string sex byte age int } type Student struct{ Person id int addr string } func main() { // 匿名字段初始化 var s1 Student = Student{Person{"hello",'m',18},1,"aaaaaa"} fmt.Println(s1) // 自动推导 s2 := Student{Person{"hello",'m',18},1,"aaaaaa"} fmt.Println(s2) fmt.Printf("%+v\n",s2) // 详细输出 // 指定成员初始化,未初始化的为0 s3 := Student{Person: Person{name:"hello"}, id:1} fmt.Printf("%+v\n",s3) }
匿名成员的使用:
package main import "fmt" type Person struct{ name string sex byte age int } type Student struct{ Person id int addr string } func main(){ s1 := Student{Person{"hello",'m',18},1,"address"} fmt.Printf("%+v\n",s1) // 匿名成员的操作 s1.id = 1 s1.name = "haha" s1.addr = "ccccc" // 整体赋值 s1.Person = Person{"sss",'m',18} fmt.Printf("%+v\n",s1) }
同名字段:就近原则
package main import "fmt" type Person struct{ name string sex byte age int } type Student struct{ Person // person里面有name字段 id int name string // student里面也有name字段 addr string } func main(){ s1 := Student{Person: Person{name:"hello"},name:"haha"} s1.name = "aaa" // 就近原则,如果本作用域找不到再找继承的 s1.Person.name = "bbb" fmt.Printf("%+v\n",s1) }
非结构体匿名字段:
package main import "fmt" type mystr string // 给类型改名 type Person struct{ name string sex byte age int } type Student struct{ Person int // 基础类型匿名字段 mystr } func main(){ s1 := Student{Person{"hello",'m',18},123,"dddd"}// 基础类型直接给对应的值即可 fmt.Println(s1) // 直接操作即可 s1.Person = Person{"aaa",'f',19} s1.int = 123 s1.mystr = "hhhh" fmt.Println(s1) }
结构体指针类型:
package main import "fmt" type Person struct{ name string sex byte age int } type Student struct{ *Person // 指针类型 id int addr string } func main(){ // 初始化方法一 // 指针类型初始化加取地址符& s1 := Student{&Person{"haha",'m',18},1,"ddddddd"} fmt.Println(s1.name, s1.sex, s1.age, s1.id, s1.addr) // 初始化方法二 var s2 Student s2.Person = new(Person) // 分配一个地址空间 s2.name = "eee" s2.sex = 'f' s2.age = 19 s2.addr = "deedededede" fmt.Println(s1.name, s1.sex, s1.age, s1.id, s1.addr) }