匿名成员的使用:

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