结构体:
 
 
结构体的创建与初始化:
 
创建格式:
type 结构体名 struct {
	成员名 数据类型
}
顺序初始化格式:
var 变量名 结构体名 = 结构体名{成员值1,成员值2}
部分初始化格式:
var 变量名 结构体名 = 结构体名{成员名:成员值,成员名:成员值}
通过结构体变量.成员方式初始化:
	var 变量名 结构体名
	变量名.成员名 = 成员值
演示:
	// 结构体可以创建在函数外面,这样是全局的,如果是定义在函数的里面就是局部的
type Student struct {
	// 成员名称不加var关键字
	id   int
	name string
	age  int
	addr string
}
func structDemo() {
	
	// 顺序初始化
	var s1 Student = Student{001, "itzhuzhu", 23, "广州"}
	// 部分初始化
	var s2 Student = Student{name: "itzhuzhu", age: 23}
	//通过结构体变量.成员方式初始化
	var stu Student
	stu.name = "itzhuzhu"
	stu.id = 23
	fmt.Println(s1)  //{1 itzhuzhu 2 广州}
	fmt.Println(s2)  //{0 itzhuzhu 23 }
	fmt.Println(stu) //{23 itzhuzhu 0 }
}
结构体与数组:
 
结构体数组定义:
 // 数组需要要指定长度
var 结构体数组名[索引] 结构体类型 = [索引] 结构体类型{}
数组修改结构体成员的值:
结构体数组名[索引].成员=值
演示:
func structDemo02() {
	var arr [3]Student = [3]Student{
		Student{001, "itzhuzhu", 23, "广州"},
		Student{002, "itzhuzhu2", 23, "广州2"},
		Student{003, "itzhuzhu3", 23, "广州3"},
	}
	fmt.Println(arr)                     //[{1 itzhuzhu 23 广州} {2 itzhuzhu2 23 广州2} {3 itzhuzhu3 23 广州3}]
	fmt.Println(arr[0])                  //{1 itzhuzhu 23 广州}
	fmt.Println(arr[0].name, arr[0].age) //itzhuzhu 23
	//结构体数组名[索引].成员=值
	arr[0].addr = "深圳"
	fmt.Println("成员值修改后", arr[0]) //{1 itzhuzhu 23 深圳}
	// 通过循环输出结构体数组中的内容
	for i := 0; i < len(arr); i++ {
		fmt.Println("通过循环输出结构体数组全部的内容:", arr[i])
		fmt.Println("通过循环输出结构体数组指定的内容:", arr[i].id)
	}
	for key, value := range arr {
		fmt.Println("key:", key)
		fmt.Println("value:", value)
		fmt.Println("打印指定内容:", value.age)
	}
}
结构体与切片:
 
 
结构体切片定义:
var 结构体数组名[] 结构体类型 = [] 结构体类型{}
切片修改结构体成员的值:
结构体切片名[索引].成员=值
演示:
func structDemo03() {
	var arr []Student = []Student{
		Student{001, "itzhuzhu", 23, "广州"},
		Student{002, "itzhuzhu2", 23, "广州2"},
		Student{003, "itzhuzhu3", 23, "广州3"},
	}
	fmt.Println(arr)                     //[{1 itzhuzhu 23 广州} {2 itzhuzhu2 23 广州2} {3 itzhuzhu3 23 广州3}]
	fmt.Println(arr[0])                  //{1 itzhuzhu 23 广州}
	fmt.Println(arr[0].name, arr[0].age) //itzhuzhu 23
	//结构体数组名[索引].成员=值
	arr[0].addr = "深圳"
	fmt.Println("成员值修改后", arr[0]) //{1 itzhuzhu 23 深圳}
	// 通过循环输出结构体数组中的内容
	for i := 0; i < len(arr); i++ {
		fmt.Println("通过循环输出结构体切片全部的内容:", arr[i])
		fmt.Println("通过循环输出结构体切片指定的内容:", arr[i].id)
	}
	for key, value := range arr {
		fmt.Println("key:", key)
		fmt.Println("value:", value)
		fmt.Println("打印指定内容:", value.age)
	}
	// 追加数据
	arr = append(arr, Student{004, "itzhuzhu4", 23, "佛山"})
	fmt.Println(arr)
}
结构体与map:
 
结构体map的定义:
make(map[key的类型]value的类型)
演示:
func structDemo04() {
	m := make(map[int]Student)
	m[0] = Student{001, "itzhuzhu", 23, "广州"}
	m[1] = Student{002, "itzhuzhu2", 23, "广州"}
	m[2] = Student{003, "itzhuzhu3", 23, "广州"}
	fmt.Println("全部数据:", m)
	fmt.Println("指定索引数据:", m[0])
	fmt.Println("指定索引成员数据:", m[0].name)
	delete(m, 0)
	for key, value := range m {
		fmt.Println("key:", key)
		fmt.Println("value:", value)
		fmt.Println("value.name:", value.name)
		fmt.Println("value.name:", value.name)
	}
}
结构体作为函数参数:
 
 
创建格式:
func 函数名(结构体){
	函数体
}
调用格式:
函数名(结构体)
演示:
func main() {
	stu := Student{001, "itzhuzhu", 23, "广州"}
	structDemo05(stu)
	fmt.Println(stu)
}
func structDemo05(stu Student) {
	// 修改结构体的成员,不会影响到原结构体
	stu.id = 999
	fmt.Println(stu)
}
求最大学生年龄:
 
 
演示:
func main() {
	stu := make([]Student, 3)
	structDemo06(stu)
}
func structDemo06(stu []Student) {
	//定义年龄最大的变量
	max := stu[0].age
	//定义年龄最大的学生索引
	var maxIndex int
	for i := 0; i < len(stu); i++ {
		fmt.Printf("请输入第%d个学生的详细信息\n", i+1)
		//切片是Student的类型,Student中有多个成员,所以要把里面的每个成员都赋值
		fmt.Scan(&stu[i].id, &stu[i].name, &stu[i].age, &stu[i].addr)
		// 如果大于最大年龄就重新赋值,然后把最大年龄的学生索引给定义的变量赋值
		if stu[i].age > max {
			max = stu[i].age
			maxIndex = i
		}
	}
	fmt.Println(stu[maxIndex])
}










