Day04

01、匿名字段初始化

package main

import "fmt"

type Person struct {
	name string //名字
	sex byte //性别
	age int //年龄
}

type Student struct {
	Person //只有类型,没有名字,匿名字段,继承了Person的成员
	id int
	addr string
}

func main() {
	//顺讯初始化
	var s1 Student = Student{Person{"mike", 'm', 22}, 18, "CN"}
	fmt.Println(s1)

	//自动推导类型
	s2 := Student{Person{"bob", 'm', 23}, 19, "CN"}
	fmt.Println(s2)
	//%+v, 显示更加详细
	fmt.Printf("%+v", s2)

	//没有赋值的常量自动初始为0

	s3 := Student{id: 2}
	fmt.Printf("%+v\n", s3)

	s4 := Student{Person: Person{name: "mike4"}}
	fmt.Printf("%+v", s4)
}

输出信息

{{mike 109 22} 18 CN}
{{bob 109 23} 19 CN}
{Person:{name:bob sex:109 age:23} id:19 addr:CN}{Person:{name: sex:0 age:0} id:2 addr:}
{Person:{name:mike4 sex:0 age:0} id:0 addr:}

02、成员的操作

package main

import "fmt"

type Person struct {
	name string //名字
	sex byte //性别
	age int //年龄
}

type Student struct {
	Person //只有类型,没有名字,匿名字段,继承了Person的成员
	id int
	addr string
}

func main() {

	s1 := Student{Person{"mike", 'm', 22}, 18, "CN"}
	s1.name = "testname"
	s1.id = 12
	s1.Person = Person{"zh", 'm', 21}

	fmt.Println(s1.name, s1.age, s1.id)

}

输出

zh 21 12

03、同名字段

package main

import "fmt"

type Person struct {
	name string //名字
	sex byte //性别
	age int //年龄
}

type Student struct {
	Person //只有类型,没有名字,匿名字段,继承了Person的成员
	id int
	addr string
	name string //和Person 中的name重名了
}

func main() {

	var s1 Student // 定义一个变量
	//默认规则(就近原则),如果能在本作用域找到次成员,就操作此成员
	s1.name =  "Bob"
	s1.id = 21
	s1.age = 23

	fmt.Printf("%+v \n", s1)

	//操作Person中的name

	s1.Person.name = "Mike" //显示调用
	fmt.Printf("%+v", s1)

}

输出

{Person:{name: sex:0 age:23} id:21 addr: name:Bob} 
{Person:{name:Mike sex:0 age:23} id:21 addr: name:Bob}

04、非结构体字匿名段

输出

Q.E.D.